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

如何重新打开已关闭的套接字以便将消息发送回客户端

王英彦
2023-03-14

使用 DataInputStream 获取从 Android 客户端发送到此 Java 桌面服务器的 int 和 long。之后,从Android客户端接收pdf文件。总共 3 个文件由客户端发送到服务器。问题是在另一个方向发送时。

我必须在while循环之后立即关闭输入和输出流。如果我不这样做,pdf文件将被破坏,程序将停止并停留在while循环中,不会继续执行到线程的末尾。

如果我必须关闭输入和输出蒸汽,插座正在关闭。我如何重新打开同一个插座?

我需要重新打开同一个套接字,因为需要向Android客户端发送一条消息,告诉它服务器收到了pdf文件,并向它发送一条确认消息,表明服务器已经安全地收到了该文件。

有多个Android客户端连接到同一个Java服务器,所以我想需要相同的套接字来将消息发送回客户端。

       byte[] buffer = new byte[fileSizeFromClient];

        while((count = dis.read(buffer)) > 0){
            bos.write(buffer, 0, count);
        }

       dis.close();  // closes DataInputStream dis
       bos.close();  // closes BufferedOutputStream bos

编辑:

来自客户端的代码

   dos.writeInt((int)length); // sends the length as number bytes is file size to the server
   dos.writeLong(serial); // sends the serial number to the server

                int count = 0; // number of bytes

                while ((count = bis.read(bytes)) > 0) {
                    dos.write(bytes, 0, count);
                }

     dos.close(); // need to close outputstream or result is incomplete file sent to server
                  // and the server hangs, stuck on the while loop
                  // if dos is closed then the server sends error free file

共有1个答案

杜弘光
2023-03-14

不,你不能重新打开一个插座。你必须做一个新的。完成文件传输后,您不必关闭套接字。服务器仍然可以重复使用它发送您的消息回复。因为您已经发送了文件大小,所以您的服务器可以使用它来知道您的客户端何时发送完完整的文件。之后,您的服务器可以将您的回复发送给客户端。

针对当前循环尝试此操作。

 int bytesRead = 0;
 while((count = dis.read(buffer)) > 0 && bytesRead != fileSizeFromClient){
  bytesRead += count; 
  bos.write(buffer, 0, count);
 }
 bos.close();
 //don't close the input stream
 类似资料:
  • 现在我有了下面的类,它使用OkHttp处理WebSockets,但它的设置方式是,我无法保持WebSocket打开,以便向web Socket发送新消息。如何在不创建新的websocket连接的情况下继续向同一个打开的websocket发送消息?

  • 我用Java编写了套接字客户端程序。我正在使用DataOutputStream向服务器套接字发送消息。有时DataOutputstream上的writed消息不会发送到ServerSocket。我想是因为我发了信息后没有脸红。我这样做,但没有用。如果我终止类执行,那么只有我从ServerSocket接收消息。 我的代码: 已完成将消息放入队列。无限while循环将负责向服务器套接字发送日志。 文件

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 我最近开始学习php套接字。我想在服务器和客户端之间创建一个永久传输控制协议!但是我的PHP套接字客户端只发送和接收一条消息。我想无限期地发送和接收消息,通过一个连接。 服务器php: 客户php:

  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 我从插座开始。io节点。js,我知道如何在本地发送消息和广播函数:-所有连接的客户端都接收相同的消息。 现在,我想知道如何向特定客户端发送私人消息,我的意思是两个人之间的私人聊天(客户端到客户端流)的一个套接字。谢谢。