TCP-соединение-сервер отправляет сообщение только после закрытия сокета
Я пытаюсь заставить клиента отправить запрос на сервер и получить ответ, сохраняя соединение.
Если я закрою сокет:
//server side
outToClient.writeBytes("Message to send");
connectionSocket.close();
//client side
serverResponse = inFromServer.readLine();
System.out.println("FROM SERVER: " + serverResponse);
Вывод на стороне клиента
От сервера: сообщение для отправки
И после этого связь, очевидно, теряется.
Если я не закрою сокет:
//server side
outToClient.writeBytes("Message to send");
//client side
serverResponse = inFromServer.readLine();
System.out.println("FROM SERVER: " + serverResponse);
Нет вывода на стороне клиента.
Сервер никогда не отправляет сообщение или клиент никогда не получает его оно.
Кто-нибудь знает возможную причину, по которой это происходит?
Клиент использует поток для получения сообщений и поток для отправки сообщений. Клиентский сокет создается в основном клиентском потоке, поэтому потоки получателя и отправителя используют текущий сокет для связи.
Заранее благодарю.
2 ответов:
Если клиент ожидает прочитать строку, сервер должен написать строку. Строка заканчивается символом
\n.Также может потребоваться очистить поток, который вы используете для отправки данных клиенту:
outToClient.writeBytes("Message to send\n"); outToClient.flush();Не видя кода, трудно сказать, требуется ли флеш или нет.
Никогда, никогда не пишите код поверх TCP без предварительного указания протокола. В противном случае, когда у вас есть такая проблема, невозможно определить, какой конец виноват.
Одна сторона считает, что она посылает "сообщение". Другая сторона не верит, что данные, которые она получает, являются "сообщением". Что правильно? Ну, если бы у нас была спецификация протокола, мы бы посмотрели на его определение "сообщения" и увидели.
Но у нас его нет, поэтому мы не можем сказать. Это делает невозможным постройте правильное исправление. Если вы измените отправителя на отправку строки, получатель все равно будет нарушен в требовании строки. Или не так? И вы меняете приемник, чтобы обрабатывать сообщения, которые не являются линиями, это исправляет или ломает его?В этом случае кажется, что обе стороны неправы. Наиболее вероятным намерением является то, что сообщение состоит из строки данных, заканчивающейся новой строкой. Отправитель не отправляет новую строку, и получатель также не настаивает на ней (потому что он принимает новую строку). данные в виде "сообщения" при закрытии соединения). Таким образом, если замысел проекта на самом деле не состоял в том, что "сообщение" - это кусок данных, не включающий конец строки, заканчивающийся либо концом строки, либо закрытием соединения, обе стороны ошибаются.
Документируйте протокол. Это очень важный шаг.
Comments