【问题标题】:File transfer through Socket in javajava中通过Socket传输文件
【发布时间】:2012-03-18 10:31:03
【问题描述】:

我正在制作一个网络文件传输系统,用于在 java 中通过网络传输任何类型的文件。尺寸也可以是任何种类。因此,我使用 UTF-8 协议来完成这项任务。

我提供了我制作的代码,但问题是有时文件会按原样传输,完全没有问题。但有时接收端只是跳过了几kb的数据,这实际上限制了mp3/video/image文件的正确打开。我认为问题出在缓冲区。我没有创建任何缓冲区,我认为现在可能对我有用。

如果有人能就该问题提供任何帮助,我将不胜感激,以便文件得到完全传输。

客户端:--->> 文件发送器

Socket clientsocket = new Socket(host,6789);                        // host contains the ip address of the remote server
DataOutputStream outtoserver = new DataOutputStream(clientsocket.getOutputStream());
try
{
    int r=0;
    FileInputStream fromFile1 = new FileInputStream(path);                  // "path" is the of the file being sent.
    while(r!=-1)
    {   
         r = fromFile1.read();
         outtoserver.writeUTF(r+"");
    }
}
catch(Exception e)
{
    System.out.println(e.toString());
}
clientsocket.close();

服务器端:--->> 文件接收器

ServerSocket welcome = new ServerSocket(6789);
Socket conn = welcome.accept();
try
{
    String r1 = new String();
    int r=0;
    FileOutputStream toFile1 = new FileOutputStream(path);                  // "path" is the of the file being received.
    BufferedOutputStream toFile= new BufferedOutputStream(toFile1);
    DataInputStream recv = new DataInputStream(conn.getInputStream());
    while(r!=-1)
    {   
        r1 = recv.readUTF();
        r = Integer.parseInt(r1);
        toFile.write(r);
    }
}
catch(Exception e)
{
    System.out.println(e.toString());
}

【问题讨论】:

  • 如果您正在处理文件,为什么还要麻烦编码?只写字节。

标签: java sockets


【解决方案1】:

我不明白您为什么将二进制数据编码为文本。

普通套接字可以毫无问题地发送和接收字节流。因此,只需使用 FileInputStream 将文件作为字节读取,然后按原样将字节写入套接字。

(为了记录,您所做的可能是为输入文件的每个字节发送 3 到 5 个字节。并且您正在以一种类型读取输入文件一个字节而没有任何缓冲。这些错误以及您犯的其他错误可能会对文件传输速度产生重大影响。获得性能的方法是使用至少 1K 字节大小的缓冲区简单地读取和写入字节数组。)


我不确定这一点,但我怀疑您丢失一些数据的原因是您在关闭发送端的套接字之前没有刷新或关闭outtoserver

跟进

我还注意到您没有在接收端刷新/关闭toFile,这可能会导致您在文件末尾丢失数据。

【讨论】:

【解决方案2】:

我看到的第一个问题是您使用的是DataInputStreamDataOutputStream。这些用于读取/写入原始 Java 类型(intlong 等),您不需要它们来仅用于二进制数据。

另一个问题是您没有刷新文件输出流 - 这可能导致丢失字节。

【讨论】:

    【解决方案3】:

    显式刷新可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多