当前位置: 首页 > 知识库问答 >
问题:

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

岳浩宕
2023-03-14

我是一个初学者程序员,所以这很可能是显而易见的,我忽略了答案。但说到这个问题。

我有一个由两部分组成的程序(它比这个例子稍微复杂一点,但情况是一样的)。该程序在客户端和服务器之间触发了多条消息。我在服务器端有一个PrintWriter来向客户机发送消息,在客户机上有一个BufferedReader来读取发送的消息。当这个例子运行时,我得到了两行作为输出。第一个消息是两个消息,第二个消息是NULL。我想知道的是,是否有一种方法可以基本停止服务器,直到我准备好接收第二条消息,这样我就可以在发送第二条消息之前在客户端执行一些操作。

    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
        }    

谢谢:)

共有1个答案

仲孙小云
2023-03-14

当前代码方式的问题在于,您使用的是bufferedreader,但服务器不会用新的行终止消息。

当您关闭写入器时,客户机将到达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();

然后你就会分门别类地收到信息...

 类似资料:
  • 我有这个tcp插座 接受一条消息,将其转换为字符串并显示它,但是如果连接没有被客户端关闭,我就不能像预期的那样看到服务器上显示的消息 如何在不需要关闭客户端连接的情况下(由客户端)从客户端发送多条消息? 这里是NodeJs中的客户端 谢谢valeriano cossu

  • 问题内容: 我正在学习Java套接字。我正在尝试向Facebook发送HTTPS GET请求,如下所示: 然后,我尝试侦听来自服务器的传入数据,如下所示: 但是我没有从服务器获得任何返回数据。为什么? 问题答案: 两个答案。 您正在尝试与HTTPS服务器通信。这要求您建立一个SSL / TLS通道。这在纯套接字上确实很难>>您必须实现连接协商,密钥链的客户端验证,会话加密/解密等。 一个更合理的方

  • 我在询问之前搜索了这个问题,但我找不到类似的东西。我开发了一个客户端/服务器解决方案来发送/接收HL7消息。我使用套接字将客户端连接到服务器,从这个连接中,我只能使用OutputSteam对象发送1条HL7消息。我如何在同一个套接字连接中发送多个HL7?我尝试了不同的方法,但它们不能正常工作。 以下是我的客户端代码: 从服务器端 如何在同一套接字连接中发送更多HL7消息?

  • 问题内容: 您好,我尝试使用Java中的客户端-服务器类发送文件。由于某种原因,当调用发送文件的方法时,套接字关闭。这是代码: 和来自客户端的代码: 和我得到的错误消息:严重:null java.net.SocketException:套接字已关闭 我对此并没有真正的经验,所以如果有帮助的话会很棒。 问题答案: 该方法返回一个,代表它实际读取的字节数。不能保证从字节数组中读取所需的字节数。它通常会

  • 我正试图通过Java的socket发送一个custome对象。我知道我需要将具有我需要发送的对象的类放在相同的包中,具有相同的serialVersionUID并实现Serializable。我已经这样做了,但我仍然不能通过套接字发送对象。我错在哪里了? 以下是客户端代码: 客户端中的类用户 发送user类对象的代码: 这里是服务器的代码: user类的代码:与客户端的user完全相同(我从客户端复

  • 我必须对FTP服务器进行编码,而且我在数据传输方面遇到了问题。 我在linux上使用ftp命令来测试它,我目前正在使用,它发送工作目录中的文件/目录列表。一切正常(ftp打印文件列表),除了ftp打印以下警告: 我想删除该警告,我认为ftp需要二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在使用最基本的方式发送结果: