2013-07-15 4 views
1

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

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

Спасибо :)

+0

Ваш клиент может послать сообщение ACK, а серверный поток будет ждать его перед отправкой другого сообщения. – vidit

+0

Вы можете использовать механизм объединения, позволяющий клиенту опросить сервер – MadProgrammer

+0

Итак, вы хотите сделать свой сервер '' SLEEP "' без использования 'Thread.Sleep'? –

ответ

0

Вы можете использовать ObjectInputStream для чтения объектов вместо строк ,
Таким образом вы будете читать только одно сообщение (строка в вашем случае) каждый вызов ObjectInputStream.readObject();

BTW вы можете прочитать первое сообщение, «сделать что-нибудь», а затем прочитать второе сообщение. вам не нужно сразу читать все отправленные сообщения.
Если других сообщений нет, ваш поток будет заблокирован при попытке прочитать объект из ObjectInputStream.
использовать его как:
ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream())

+1

Хороший совет, как это помогает? – MadProgrammer

+0

@MadProgrammer Я отредактировал свой ответ :) – m1o2

+0

Там, намного лучше;) – MadProgrammer

0

Проблема с тем, как вы в настоящее время есть ли у вас код является тот факт, что вы используете 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(); 

Тогда вы получите сообщения seperatly ...

+0

Отлично, я подумал, что это было что-то очевидное, что я не замечал. Есть ли способ написать символ Newline без чтения чтения Reader? –

+0

Да, но вам придется читать содержимое читателя вручную ... – MadProgrammer