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
        }    

谢谢 :)

4

2 回答 2

1

您当前编码方式的问题在于您使用的是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();

然后你会收到单独的消息......

于 2013-07-15T05:21:17.427 回答
-1

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

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

于 2013-07-15T05:10:20.027 回答