2013-07-08 5 views
2

Я программирую инструмент чата. JTextField читает текст, который я получаю через .getInputStream() из клиентского сокета. Но теперь я должен решить, является ли новый символ частью сообщения (строка, отправленная в сокет) или первый символ нового сообщения.Java: Как выяснить, получает ли текст .getInputStream() текст или нет?

Моя недавняя идея состоит в том, чтобы выяснить, получает ли мой метод .getInputStream() в клиентском соке в течение одного момента текст или нет. Есть ли способ узнать это?

+0

У вас есть кнопка с приложением для прослушивания действий, которая отправляет текст где-то после его ввода или, что самое важное, прослушиватель действий в целом, смотрящий на ваш JTextField? –

+0

Да, у меня есть кнопка отправки с прослушивателем действий, но этот текст отправляется только на IP-адрес и порт. – user2551736

ответ

1

Вместо того, чтобы отправлять чистый текст, вы можете отправить пакет данных ... отправить размер строки сообщения (в виде кодированного целого), за которым следует сообщение в виде текста. Или, как говорит субам, просто используйте функцию кодирования строк для отправки целых строк за раз. Это сделает буферизацию для вас. Вы должны использовать встроенные функции для определения этих границ, а не для себя.

+0

Хорошая идея! Теперь я заканчиваю каждое сообщение с помощью (char) 127, которое не может быть представлено в JTextField, но оно может быть распознано и использовано для условия if-цикла в методе «получать». Выглядит странно, но мне это нравится, и это определенно работает. – user2551736

1

Создайте выходной поток сокета на сервере и используйте метод writeUTF() для печати строки в сокете. Вот и все ..

0

Попробуйте

BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream())); 
String line; 
while ((line = is.readLine()) != null) 
    System.out.println(line); 
} 
0

Я не думаю, что вы сможете сделать свой предложенный подход работу надежно. В принципе, вы не можете достоверно различать границы «сообщений» в сетевом потоке, потому что перегрузка сети и т. П. Искажает время поступления пакета, в результате чего несколько (или частичных) «сообщений» могут быть доставлены в ответ на вызов read(...) поток.

Если вам нужна структура сообщений для вашего протокола, вам необходимо использовать что-то в самом потоке данных, чтобы очертить границы сообщений. Например, вы можете зарезервировать значение данных для обозначения «конец сообщения» или префикс каждого сообщения с байтом.

Смежные вопросы