如何处理通过套接字连接发送多条消息?

时间:2013-07-15 05:05:44

标签: java sockets bufferedreader printwriter

我是一个初学程序员,所以这很明显,我忽略了答案。但是关于这个问题。

我有一个两部分程序(它比这个例子稍微复杂一点,但情况是一样的)。该程序在客户端和服务器之间触发了多条消息。我在服务器端有一个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 个答案:

答案 0 :(得分:0)

您可以使用ObjectInputStream来阅读对象而不是字符串 这样,每次调用ObjectInputStream.readObject()时,您将只读取一个Message(在您的情况下为String);

BTW你可以阅读第一条消息,“做点什么”,然后阅读第二条消息。您不必一次阅读所有已发送的消息 如果没有其他消息,则在尝试从ObjectInputStream中读取对象时,将阻止您的线程 使用方式如下:
 ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream() )

答案 1 :(得分: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();

然后你会分开得到这些消息......