powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Socket: правильное закрытие
16 сообщений из 16, страница 1 из 1
Socket: правильное закрытие
    #38769094
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги.
Есть проблема с закрытием соединения.
Socket.close срабатывает(хоть и с руганью) на андроиде 4.1 , а на 2.2. нет.
Проблема в закрытии читателя этого сокета inputreader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
В бесконечном цикле ожидания чтения inputreader.readLine(); висит и ждет пока что-нибудь на него свалится.
И когда появляется необходимость отключиться, inputreader.close виснет и дальше не идет, соединение соответственно остается висеть.
Теоретически можно про него забыть, а при необходимости заново подключиться,
создается новый сокет и читатель, но в андроиде есть ограничение на количество открытых сокетов, 5 или 6 штук.
Можете подсказать, как правильно отсоединяться?
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38769144
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333В бесконечном цикле ожидания чтения inputreader.readLine(); висит и ждет пока что-нибудь на него свалится.
Зачем бесконечный цикл? Код читателя покажи.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38769172
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Цикл стандартный(с небольшими вариациями), как во всех примерах:
Код: java
1.
2.
3.
4.
while (mRun) {
                    serverMessage = input.readLine();
                    processMessage(serverMessage );
                   }



Нашел решение: socket.shutdownInput();
Теперь нормально выходит из состояния ожидания чтения и благополучно закрывается.
Целый день искал решение, как сюда вопрос задал, быстро ответ сам нашелся. :)
Спасибо.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38769206
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlad333
Код: java
1.
2.
3.
4.
while (mRun) {
                    serverMessage = input.readLine();
                    processMessage(serverMessage );
                   }


Этот цикл должен выполняться в отдельном потоке и проверяться на isInterrupted. В добавок нет проверок на ошибки...
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38769388
vlad333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это выполняется в потоке, isInterrupted добавил, спасибо.
Проверки есть, просто не стал лишний несмысловой хлам сюда пихать.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38770303
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не хотел плодить новую тему - но я уже целый день долбаюсь с такой же проблемой и ее не решил. Вобщем есть тестовый 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.
            Log.d("NP", "read0");
            BufferedReader input = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));

//            socket.shutdownInput();

            post = input.readLine();

            Log.d("NP", "read1");



Тестовый сервер и клиент писал когда-то давно я на делфи с использованием инди и знаю что вариант 1 от варианта 2 отличается способом передачи - возможно во втором варианте нет в конце строки какого-то "символа окончания" - но я не могу понять почему тестовый клиент нормально принимает такой ответ, а код на андроиде - нет.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38770363
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола Питерский,

1. Зачем буферное чтение?
2. Читай по байтам/символам и выкидывай все читаемое в лог.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38770431
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, ты гений!!! Теперь все работает - большое спасибо!!!
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38770754
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно ли открыть сокет и его не закрывать между передачами данных или же это увеличит энергопотребление модема?
Вроде после 20 сек бездействия модем отключается от питания?
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38770957
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийА можно ли открыть сокет и его не закрывать между передачами данных или же это увеличит энергопотребление модема?
Вроде после 20 сек бездействия модем отключается от питания?

а смысл ?
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38771228
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжибсМикола ПитерскийА можно ли открыть сокет и его не закрывать между передачами данных или же это увеличит энергопотребление модема?
Вроде после 20 сек бездействия модем отключается от питания?

а смысл ?

Батарея в смартфонах не резиновая - смысл в экономии заряда батареи. По идее открытый сокет не даст уснуть модему.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38771243
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибс, смысл держать открытым сокет - ну на сервере число одновременных подключений ограничено и есть вероятность что во время постоянного переподключения от сервера придет отказ в подключении. На сервер ломятся десктопные приложения, которые сокет постоянно держат открытым. Кто с утра подключился - тот и нормально работает.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38771263
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем насчет ограничения числа подключений меня ввели в заблуждение - на самом деле в протоколе обмена после подключения к серверу нужно произвести запрос капчи и на ее правильно ответить иначе все последующие запросы придут пустыми. Т.е. сервак помнит что для указанного подключения произведена авторизация и если я буду закрывать сокет - то мне нужно каждый раз пользователю предлагать ответить на капчу - а запросы от устройства будут идти примерно 1 раз в 30 - 60 сек .
Поэтому и спрашиваю - почстоянно открытый сокет увеличит энергопотребление устройства?
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38771269
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так начните с бекенда.

Мобильные решения, в принципе не подразумевают постоянную связь.
так как спустился в подземку уже все, пропал сигнал.

да и вообще бывает так, сотовый сигнал есть, а что то интернет тупит, все оборвалась связь.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38771272
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийПоэтому и спрашиваю - почстоянно открытый сокет увеличит энергопотребление устройства?

Не думаю, скорее постоянная передача данных.
да и все зависит от задачи.
...
Рейтинг: 0 / 0
Socket: правильное закрытие
    #38771273
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийПоэтому и спрашиваю - почстоянно открытый сокет увеличит энергопотребление устройства?
Проверить проще... По логике не сокет, а работающая программа увеличит потребление, т.к. она будет постоянно находиться в памяти и её нельзя скинуть в кэш.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Socket: правильное закрытие
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]