我正在尝试编写一个接受文件的服务器,并使用 DataInputStream 和 BufferedInputStream 将其写入某个目录。
服务器获取“用户名(字符串)”“文件数(整数)”“文件名(字符串)”“每个文件的大小(长)”和“未解释字节的文件内容(字节 [])”
如果一切顺利,我应该发送布尔值。
但问题是它没有正确接收文件。
有时我会收到“断管”错误消息或收到后文件已损坏。
我看了我的代码 4 小时,找不到问题。
你能帮我解决这个问题吗?您可以假设客户端工作正常。
我正在尝试编写一个接受文件的服务器,并使用 DataInputStream 和 BufferedInputStream 将其写入某个目录。
服务器获取“用户名(字符串)”“文件数(整数)”“文件名(字符串)”“每个文件的大小(长)”和“未解释字节的文件内容(字节 [])”
如果一切顺利,我应该发送布尔值。
但问题是它没有正确接收文件。
有时我会收到“断管”错误消息或收到后文件已损坏。
我看了我的代码 4 小时,找不到问题。
你能帮我解决这个问题吗?您可以假设客户端工作正常。
首先,您不必关闭所有这些流。这可能就是您看到管道破损问题的原因。您只需要关闭输入和输出流。
DataInputStream din = new DataInputStream( new BufferedInputStream( socket.getInputStream() ) );
DataOutputStream dout = new DateOutputStream( new BufferedOutputStream( socket.getOutputStream() );
try {
} finally {
din.close();
dout.close();
}
您不必关闭所有这些流的原因是,当调用 din/dout.close() 时,您的 Buffered*Streams 和套接字 InputStream/OutStream 将被关闭。这些将通过它们链接到的引用关闭流。您还可以摆脱所有 if( blah != null ) 垃圾,因为如果您到达 finally 子句,您就知道它们是非空的。如果您不尝试新事物,您就会知道情况就是这样。
您还泄漏了 FileOutputStream,因为您用第二个新 FileOutputStream() 覆盖了 fos 变量。你在用 SUBMIT_DONE 文件做什么?这真的很奇怪。这样做是很糟糕的主意。不要像那样使用两次变量引用。我可能会在你的循环之后关闭第一个文件。考虑用 try {} finally { fos.close(); 包装那个循环。}。
你可能会尝试使用一些方法来打破它。抛弃静电。
更新:
您认为以下内容到底在做什么?
while(c!='\0') {
userName += c;
c = din.readChar();
}
根据您从客户端或服务器发送数据的方式,您可以使用:
String userName = din.readUTF();
请记住,使用 DataInputStream 您正在处理格式化的 BINARY 数据。您还可以为文件名再次重复该确切的循环代码。如果您不能使用 readUTF() ,那么创建一个方法来包装该循环并返回一个字符串并从这两个地方调用它。您有各种各样的安全问题,允许客户端向您上传原始文件名和文件。我希望亲爱的宝贝,你正在构建的这个服务器没有被部署在生产中。
您还需要刷新和关闭通过套接字接收的每个文件,以便将发送的全部数据量完全写入文件。