Java-сокеты не читают данные - PullRequest
1 голос
/ 25 июля 2011

Я программирую приложение сервера (Java) - клиента (Android / Java).Сервер W7.Все взаимодействие идет хорошо до тех пор, пока одно клиентское чтение не замерзнет и не прекратит чтение данных, пока я не отправлю его в 2 раза больше.

Данные, не прочитанные, являются байтовым массивом.Я повторяю, что до этого момента все взаимодействие идет хорошо.

Вот код, который я использую для отправки данных:

Long lLength = new Long(length);
byte [] bLength = this.longToBytes(lLength.longValue());
dos.write(bLength);
dos.flush();

dos.write(bLength);
dos.flush();

dos.write(bLength);
dos.flush();

Этот код преобразует длинное значение в массив из 8 байтов.Как я уже сказал, когда выполняется первая запись (а клиент ожидает данные), чтение не выполняется.Это не будет сделано до тех пор, пока я не выполню последнюю запись ().

А вот код для его чтения:

byte length[] = {0,0,0,0,0,0,0,0};
dis.read(length);

Я использовал Wireshark, чтобы прослушивать трафик, и я могу видетьчто байтовый массив отправляется, и клиент отвечает ACK, но чтение не выполняется.

В клиенте и на сервере сокеты настроены следующим образом:

socket = new Socket(sIP, oiPort.intValue());
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());

Это сводит меня с ума ... Я не знаю, почему в какой-то момент приложение перестает читать данные, когда я отправляю их так же, как всегда.

Я полагаю, что проблема может бытьво входных буферах клиентского сокета ... Но я не знаю, что делать или что попробовать ...

Скажите, что я также тестировал сервер в WXPSP3, и он все еще не 'т работа.

1 Ответ

1 голос
/ 25 июля 2011

Первое, на что я посмотрю, это код вашего longToBytes метода. Действительно ли это создание байтового массива из 8 байтов? Если он генерирует массив размером менее 8 байтов, то это объясняет проблему. (Ваш клиент ожидает 8 байтов и будет блокироваться, пока все они не поступят.)

Следующее, что я хотел бы задать себе, - почему я не просто использую writeLong и readLong Это упростит ваш код и, возможно, решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...