|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Добрый день, коллеги. Есть проблема с закрытием соединения. Socket.close срабатывает(хоть и с руганью) на андроиде 4.1 , а на 2.2. нет. Проблема в закрытии читателя этого сокета inputreader = new BufferedReader(new InputStreamReader(socket.getInputStream())); В бесконечном цикле ожидания чтения inputreader.readLine(); висит и ждет пока что-нибудь на него свалится. И когда появляется необходимость отключиться, inputreader.close виснет и дальше не идет, соединение соответственно остается висеть. Теоретически можно про него забыть, а при необходимости заново подключиться, создается новый сокет и читатель, но в андроиде есть ограничение на количество открытых сокетов, 5 или 6 штук. Можете подсказать, как правильно отсоединяться? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 14:09 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
vlad333В бесконечном цикле ожидания чтения inputreader.readLine(); висит и ждет пока что-нибудь на него свалится. Зачем бесконечный цикл? Код читателя покажи. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 14:43 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Цикл стандартный(с небольшими вариациями), как во всех примерах: Код: java 1. 2. 3. 4.
Нашел решение: socket.shutdownInput(); Теперь нормально выходит из состояния ожидания чтения и благополучно закрывается. Целый день искал решение, как сюда вопрос задал, быстро ответ сам нашелся. :) Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 14:57 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
vlad333 Код: java 1. 2. 3. 4.
Этот цикл должен выполняться в отдельном потоке и проверяться на isInterrupted. В добавок нет проверок на ошибки... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 15:16 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Это выполняется в потоке, isInterrupted добавил, спасибо. Проверки есть, просто не стал лишний несмысловой хлам сюда пихать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 16:49 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Не хотел плодить новую тему - но я уже целый день долбаюсь с такой же проблемой и ее не решил. Вобщем есть тестовый TCP сервер (не под андроид), который принимает две команды на вход: вариант 1 вход->test выход<-100 BBBBBBB вариант2 вход->test222 выход<-Ok Я на андроиде успешно передаю "test" и получаю ответ "100 BBBBBBB", но я никак не могу обработать вариант 2, при попытке прочитать отправленные сервером данные "Ok" клиент виснет на функции чтения и висит пока я не закрою тестовый сервер, как только сервак закрывается то функция чтения "отвисает" и получает долгожданное "Ok". Самое смешное в этой ситуации то что есть тестовый клиент (не на анроид), который подключается к этому же серверу и я на нем успешно получаю ответ для двух вариантов мгновенно и без закрытия сервера. Вот код чтения для андроида - он в потоке и в try Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
Тестовый сервер и клиент писал когда-то давно я на делфи с использованием инди и знаю что вариант 1 от варианта 2 отличается способом передачи - возможно во втором варианте нет в конце строки какого-то "символа окончания" - но я не могу понять почему тестовый клиент нормально принимает такой ответ, а код на андроиде - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2014, 12:55 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Микола Питерский, 1. Зачем буферное чтение? 2. Читай по байтам/символам и выкидывай все читаемое в лог. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2014, 13:27 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
wadman, ты гений!!! Теперь все работает - большое спасибо!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2014, 14:11 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
А можно ли открыть сокет и его не закрывать между передачами данных или же это увеличит энергопотребление модема? Вроде после 20 сек бездействия модем отключается от питания? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2014, 17:50 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Микола ПитерскийА можно ли открыть сокет и его не закрывать между передачами данных или же это увеличит энергопотребление модема? Вроде после 20 сек бездействия модем отключается от питания? а смысл ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2014, 21:59 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
ДжибсМикола ПитерскийА можно ли открыть сокет и его не закрывать между передачами данных или же это увеличит энергопотребление модема? Вроде после 20 сек бездействия модем отключается от питания? а смысл ? Батарея в смартфонах не резиновая - смысл в экономии заряда батареи. По идее открытый сокет не даст уснуть модему. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 09:46 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Джибс, смысл держать открытым сокет - ну на сервере число одновременных подключений ограничено и есть вероятность что во время постоянного переподключения от сервера придет отказ в подключении. На сервер ломятся десктопные приложения, которые сокет постоянно держат открытым. Кто с утра подключился - тот и нормально работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 09:57 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
В общем насчет ограничения числа подключений меня ввели в заблуждение - на самом деле в протоколе обмена после подключения к серверу нужно произвести запрос капчи и на ее правильно ответить иначе все последующие запросы придут пустыми. Т.е. сервак помнит что для указанного подключения произведена авторизация и если я буду закрывать сокет - то мне нужно каждый раз пользователю предлагать ответить на капчу - а запросы от устройства будут идти примерно 1 раз в 30 - 60 сек . Поэтому и спрашиваю - почстоянно открытый сокет увеличит энергопотребление устройства? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 10:14 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Ну так начните с бекенда. Мобильные решения, в принципе не подразумевают постоянную связь. так как спустился в подземку уже все, пропал сигнал. да и вообще бывает так, сотовый сигнал есть, а что то интернет тупит, все оборвалась связь. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 10:17 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Микола ПитерскийПоэтому и спрашиваю - почстоянно открытый сокет увеличит энергопотребление устройства? Не думаю, скорее постоянная передача данных. да и все зависит от задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 10:18 |
|
Socket: правильное закрытие
|
|||
---|---|---|---|
#18+
Микола ПитерскийПоэтому и спрашиваю - почстоянно открытый сокет увеличит энергопотребление устройства? Проверить проще... По логике не сокет, а работающая программа увеличит потребление, т.к. она будет постоянно находиться в памяти и её нельзя скинуть в кэш. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 10:18 |
|
|
start [/forum/topic.php?fid=13&msg=38769172&tid=1331560]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
145ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 250ms |
total: | 496ms |
0 / 0 |