Как обрабатывать отправку нескольких сообщений через сокет-соединение?

Я начинающий программист, так что, возможно, это совершенно очевидно, и я упускаю из виду ответ. Но к вопросу.

У меня есть программа из двух частей (немного сложнее, чем в этом примере, но ситуация такая же). Программа имеет несколько сообщений между клиентом и сервером. У меня есть 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() )

Другие вопросы по тегам