Как обрабатывать отправку нескольких сообщений через сокет-соединение?
Я начинающий программист, так что, возможно, это совершенно очевидно, и я упускаю из виду ответ. Но к вопросу.
У меня есть программа из двух частей (немного сложнее, чем в этом примере, но ситуация такая же). Программа имеет несколько сообщений между клиентом и сервером. У меня есть PrintWriter на стороне сервера для отправки сообщений клиенту, а на клиенте у меня есть BufferedReader для чтения отправленных сообщений. Когда запускается этот пример, мне выдаются две строки. Первое сообщение - это оба сообщения, а второе - NULL. Что мне интересно, так это то, есть ли способ остановить сервер, пока я не буду готов ко второму сообщению, чтобы я мог что-то сделать на стороне клиента до отправки второго сообщения.
Я надеюсь не использовать Thread.Sleep, так как я бы предпочел, чтобы Сервер подождал, пока Клиент не скажет, что он готов.
Это клиент:
public class Client{
public void run(){
Socket socket = null;
InputStream in = null;
BufferedReader reader = null;
try{
socket = new socket("LocalHost",1234);
in = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
}
String messageFromServer = "";
try{
messageFromServer=reader.readLine();
}
System.out.println(messageFromServer);
String messageFromServer = "";
try{
messageFromServer=reader.readLine();
}
System.out.println(messagefromServer);
//close everything
}
}
Это сервер:
public class Server{
public void run(){
ServerSocket server = null;
Socket client = null;
try{
server = new ServerSocket(1234);
client = server.accept();
}
PrintWriter writer = null;
OutputStream out = null;
try{
out = client.getOutputStream();
writer = new PrintWriter(out, true);
}
writer.write("Hi I'm a server");
//do some stuff that takes some time, user input, etc. etc.
writer.write("I'm still a server");
//close everything
}
Спасибо:)
2 ответа
Проблема с тем, как вы в настоящее время используете ваш код, заключается в том, что вы используете BufferedReader
, но сервер не завершает свои сообщения новой строкой.
Когда вы закрываете writer
клиент достигает EOF или EOS и разблокирует чтение, поэтому кажется, что обе строки отправляются одновременно...
Если вы делаете что-то вроде...
writer.write("Hi I'm a server\n");
// This will force the message to be written to the client and picked up ;)
writer.flush();
writer.write("I'm still a server\n");
writer.flush();
Тогда вы получите сообщения отдельно...
Вы можете использовать ObjectInputStream для чтения объектов вместо строк.
Таким образом, вы будете читать только одно Сообщение (Строка в вашем случае) каждый вызов ObjectInputStream.readObject();
Кстати, вы можете прочитать первое сообщение, "сделать что-то", а затем прочитать второе сообщение. Вам не нужно читать все отправленные сообщения сразу.
Если других сообщений нет, то ваш поток будет заблокирован при попытке прочитать объект из ObjectInputStream.
Используйте это как:ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream() )