Запись в Socket outputStream без его закрытия - PullRequest
4 голосов
/ 13 мая 2010

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

os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
os.close();

Как я могу сохранить OutputStream этого сокета, os, открытым и все еще иметь возможность отправлять сообщение?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 13 мая 2010

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

os.write(msgBytes);
os.write("\r\n".getBytes());
os.flush();
// Do something 
os.write("more message");
os.flush();
// When you are finally done
os.close();
2 голосов
/ 13 мая 2010

В большинстве протоколов сервер принимает символы типа EOF. Отправьте такой символ вместо закрытия потока.

Например, серверы IRC интерпретируют "\ r \ n" как конец сообщения. Это будет 2 сообщения на одном открытом OutputStream:

PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.print("JOIN #channel1\r\n");
printStream.flush( );
printStream.print("JOIN #channel2\r\n");
printStream.flush( );

Кроме того, вы должны обернуть свой outputStream в DataOutputStream. Эта обертка создает более переносимый вывод. Обычный OutputStream может вызвать проблемы с некоторыми примитивными типами данных, если сервер и клиент имеют разные компьютерные архитектуры.

1 голос
/ 20 мая 2010

Я нашел проблему, и она лежит на стороне клиента. На клиенте я использовал -

count = inputStream.read(buffer)) > -1

Это означает, что клиент ожидает закрытия outputStream сервера и затем обрабатывает входящие данные.

1 голос
/ 13 мая 2010

Оберните Socket OutputStream в PrintWriter и вызовите метод PrintWriter * println.

PrintWriter pw = new PrintWriter(socket.getOutputStream());
....
pw.println(message); // call repeatedly to send messages.
....
pw.close(); // when finished writing to server and want to close conn.
...