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

问题描述 投票:1回答:2

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

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

谢谢 :)

java sockets bufferedreader printwriter
2个回答
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();

然后你将分别得到消息......


-1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.