【问题标题】:Receiving file on connection timed out连接时接收文件超时
【发布时间】:2016-05-31 04:06:09
【问题描述】:

我创建了一个向客户端 (Android) 发送文本文件的服务器,并且只有在连接超时时才获取该文件。

为什么首先会发生“连接超时”?而且,接收文件 (1MB) 大约需要 1 分钟。

服务器:

    FileInputStream fis = new FileInputStream(
                                        new File("123.txt");
                                BufferedInputStream bis = new BufferedInputStream(fis);
                                DataInputStream dis = new DataInputStream(bis);

                                byte[] mybytearray = new byte[8192];

                                OutputStream os;
                                try {
                                    os = clientSocket.getOutputStream();
                                    DataOutputStream dos = new DataOutputStream(os);
                                    int read;

                                    while ((read = dis.read(mybytearray)) > 0) {
                                        dos.write(mybytearray, 0, read);

                                    }

                                } catch (IOException e) {
                                    e.printStackTrace();
                                }

客户:

InputStream in;
                                    int Size = 0;

                                    try {
                                        Size = clientSocket.getReceiveBufferSize();
                                        in = clientSocket.getInputStream();
                                        DataInputStream dis = new DataInputStream(in);
                                        byte[] buffer = new byte[Size];
                                        int read;

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

                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }

知道如何解决这个问题吗?

【问题讨论】:

  • 您是否搜索过与您的错误信息匹配的关键字?
  • 是的,我做到了,但亚历克斯找到了答案。谢谢你的回复。
  • 您的意思是“读取超时”,而不是“连接超时”?

标签: java android file server client


【解决方案1】:

您不会在服务器端关闭流。所以没有人知道这是流的结束,等待一直持续到超时。像这样添加 close():

 os = clientSocket.getOutputStream();
 DataOutputStream dos = new DataOutputStream(os);
 int read;

  while ((read = dis.read(mybytearray)) > 0) {
       dos.write(mybytearray, 0, read);
  }
  os.close();

此外,在客户端,您应该期望零输入。它可以用于慢速连接。只有 -1 表示连接已关闭。像这样更改代码:

while ((read = dis.read(buffer)) > -1)

【讨论】:

  • 你不应该期望零,在慢速连接或其他任何地方。 InputStream.read() 不可能返回零,除非您提供零长度。请参阅 Javadoc。
  • 所以,当我提供零长度时,它是可能的。正确的?我添加这个的原因是因为我实际上的长度为零。请删除您的反对票。
  • 当您提供零长度时,它是确定的, 不仅仅是“可能的”,而且它与慢速链接没有任何关系。为什么要在编码错误上永远循环是另一个谜。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多