【问题标题】:How to handle sending multiple messages over a socket connection?如何处理通过套接字连接发送多条消息?
【发布时间】:2013-07-12 21:28:46
【问题描述】:

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

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

谢谢:)

【问题讨论】:

  • 你的客户端可以发送一个ACK消息,服务器线程会等待它再发送另一个消息。
  • 你可以使用池化机制,让客户端轮询服务器
  • 所以你想让你的服务器"SLEEP"而不使用Thread.Sleep
  • 我强烈建议你停下来仔细阅读Java Socket Tutorials
  • 此代码无法编译。您不需要在阻塞网络代码时睡觉。如果您从readLine() 获得null,则对等方已关闭连接。不清楚你在问什么。

标签: java sockets bufferedreader printwriter


【解决方案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();

然后您将分别收到消息...

【讨论】:

  • 完美,我认为我忽略了一些明显的东西。有没有办法在不让阅读器停止阅读的情况下编写换行符?
【解决方案2】:

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

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

【讨论】:

  • 好建议,有什么帮助?
  • 那里,好多了;)
猜你喜欢
  • 2020-03-07
  • 2015-01-19
  • 1970-01-01
  • 2017-08-05
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多