gpt4 book ai didi

java网络编程,尝试编写服务器但不工作

转载 作者:行者123 更新时间:2023-12-02 08:09:23 25 4
gpt4 key购买 nike

我正在尝试编写一个接受文件并使用 DataInputStream 和 BufferedInputStream 将其写入特定目录的服务器。

服务器获取“用户名(字符串)”“文件数量(整数)”“文件名(字符串)”“每个文件的大小(长)”和“未解释字节的文件内容(字节[]” )'

如果一切成功,我应该发送 boolean 值。

但问题是它没有正确接收文件。

我有时会收到“管道损坏”错误消息,或者收到后文件已损坏。

我查看了我的代码 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,因为您用第二个 new FileOutputStream() 覆盖了 fos 变量。您正在对 SUBMIT_DONE 文件做什么?这确实很奇怪。这样做是非常糟糕的主意。不要像这样两次使用变量引用。我可能会在循环后关闭第一个文件。考虑用 try {} finally { fos.close(); 包装该循环。 }.

你可以尝试使用方法来稍微打破这个问题。抛弃静电。

更新:

您认为以下内容到底在做什么?

while(c!='\0') {
userName += c;
c = din.readChar();
}

根据您从客户端或服务器发送数据的方式,您可以使用:

String userName = din.readUTF();

请记住,您正在使用 DataInputStream 处理格式化的二进制数据。您还可以为文件名再次重复该确切的循环代码。如果您无法使用 readUTF(),则创建一个方法来包装该循环并返回一个字符串,然后从这两个位置调用它。您遇到各种安全问题,允许客户上传原始文件名和文件给您。我希望亲爱的天哪,您正在构建的这台服务器没有部署在生产环境中。

您还需要刷新并关闭通过套接字接收到的每个文件,以便将发送的全部数据完全写入文件。

关于java网络编程,尝试编写服务器但不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7682771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com