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

0 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();
Run Code Online (Sandbox Code Playgroud)

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

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());
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 5

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

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

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


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

跟进

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