gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:38:19 25 4
gpt4 key购买 nike

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

我提供了我制作的代码,但问题是有时文件会按原样传输,根本没有问题。但有时接收端会跳过几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());
}

最佳答案

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

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

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

<小时/>

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

跟进

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

关于java - java中通过Socket进行文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6956102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com