0

使用 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
4

1 回答 1

1

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

试试这个为你当前的循环。

 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
于 2013-09-24T02:26:07.170 回答