通过java中的Socket进行文件传输

时间:2011-08-05 12:17:03

标签: java sockets

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

我正在提供我已经制作的代码,但问题是有时候文件会按原样转移,完全没有问题。但有时在接收端只跳过几个kb的数据,这实际上限制了mp3 /视频/图像文件的正确打开。我认为问题出在BUFFER上。我现在没有创建任何缓冲区,我认为这对我来说可能有用。

如果有人能就问题提供任何帮助,我真的很感激,这样文件就可以完全转移。

客户端:--->>文件发件人

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());
}

3 个答案:

答案 0 :(得分:5)

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

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

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


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

关注

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

明确的同花可能有助于这种情况。