通过java套接字发送文件

时间:2014-11-25 01:25:46

标签: java file sockets

我一直在搜索Google几个小时,试图找出如何通过Java套接字成功发送任何文件。我在网上发现了很多东西,但似乎没有一个对我有用,我终于遇到了对象输出/输入流来在服务器和客户端之间发送文件,到目前为止,我发现它是唯一有效的,但是它似乎只能通过与localhost的连接工作。例如,如果我从另一个网络上的朋友计算机连接到服务器并发送文件失败,则套接字关闭说"读取超时"然后在重新连接后不久,文件永远不会被发送。如果我连接到服务器上的localhost并发送文件它完美地工作。那么问题是什么,我该如何解决呢?

编辑:下面是更新的代码..移动速度非常慢

public synchronized File readFile() throws Exception {
    String fileName = readLine();
    long length = dis.readLong();
    File temp = File.createTempFile("TEMP", fileName);
    byte[] buffer= new byte[1000];
    int count=0;
    FileOutputStream out = new FileOutputStream(temp);
    long total = 0;
    while (total < length && (count = dis.read(buffer, 0, (int)Math.min(length-total, buffer.length))) > 0)
    {
        System.out.println(total+" "+length+" "+temp.length()); //Just trying to keep track of where its at...
        out.write(buffer, 0, count);
        total += count;
    }
    out.close();
    return temp;
}


public synchronized void writeFile(File file) throws Exception {
    writeString(file.getName());
    long length = file.length();
    dos.writeLong(length);
    byte[] buffer= new byte[1000];
    int count=0;
    FileInputStream in = new FileInputStream(file);
    long total = 0;
    while (total < length && (count = dis.read(buffer, 0, (int)Math.min(length-total, buffer.length))) > 0)
    {
        System.out.println(total+" "+length); //Just trying to keep track of where its at...
        dos.write(buffer, 0, count);
        total += count;
    }
    in.close();
}

客户端和服务器都有writeFile和readFile。目前我正在使用它来发送和显示图像。

1 个答案:

答案 0 :(得分:2)

不要使用对象流。使用DataInputStreamDataOutputStream:

  1. 使用writeUTF()readUTF()发送和接收文件名。
  2. 发送和接收数据,如下所示:

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    

    您可以在两端使用此代码。 buffer可以是大于零的任何大小。它不需要是文件的大小,并且不会扩展到大文件。

  3. 关闭套接字。

  4. 如果您需要发送多个文件,或者还有其他需要保持套接字打开:

    1. 使用writeLong()发送文件前面的长度,并使用readLong()读取并修改循环,如下所示:

      long length = in.readLong();
      long total = 0;
      while (total < length && (count = in.read(buffer, 0, length-total > buffer.length ? buffer.length : (int)(length-total))) > 0)
      {
          out.write(buffer, 0, count);
          total += count;
      }
      

      并且不要关闭套接字。请注意,您必须在读取之前测试total ,并且必须调整读取长度参数,以免超出文件末尾。