我正在建立一个网络文件传输系统,用于在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)
我不明白你为什么要将二进制数据编码为文本.
普通套接字可以毫无问题地发送和接收字节流.因此,只需使用FileInputStream将文件作为字节读取,并按字节顺序将字节写入套接字.
(对于记录,你正在做的可能是为输入文件的每个字节发送3到5个字节.并且你正在读取一个字节的输入文件,没有任何缓冲.这些错误和你做的其他错误很可能对文件传输速度有重大影响.获得性能的方法是使用至少1K字节的缓冲区大小读取和写入字节数组.)
我不确定这一点,但我怀疑你丢失一些数据的原因是你outtoserver在关闭发送端的套接字之前没有刷新或关闭.
跟进
我还注意到你没有toFile在接收器端刷新/关闭,这可能导致你在文件末尾丢失数据.
| 归档时间: |
|
| 查看次数: |
4392 次 |
| 最近记录: |