[英]File transfer using UDP
我编写了一个程序来将文件从客户端传输到服务器端。 程序运行没有任何错误。 此外,该文件是在目标路径上创建的。 但是当我尝试打开文件时,gedit 崩溃了。 该程序应该传输音频、视频、文本文件。我知道不应该使用 UDP 传输文件,因为它可能已损坏,但我必须将其作为分配来执行。 以下代码用于文本文件传输。
服务器端.java
import java.net.*;
import java.io.*;
public class server
{
public static void main(String args[])throws IOException
{
DatagramSocket dsoc=new DatagramSocket(8008);
byte b[]=new byte[787734];
byte c[];
String pac ;
File file = new File("/home/san_16398/ip2.java");
FileOutputStream f = new FileOutputStream(file);
while(true)
{
DatagramPacket dp=new DatagramPacket(b,b.length);
dsoc.receive(dp);
pac =new String(dp.getData(),0,dp.getLength());
System.out.println(pac);
}
pac.getBytes();
f.write(b);
f.flush();
f.close();
}
}
客户端.java
import java.net.*;
import java.io.*;
public class client
{
private static final int BUFFER_SIZE = 4096;
public static void main(String args[])throws Exception
{
byte b[]=new byte[787734];
FileInputStream f=new FileInputStream("/home/san_16398/ip.java");
DatagramSocket dsoc=new DatagramSocket(2000);
int i=0;
byte[] buffer = new byte[BUFFER_SIZE];
while(f.read(buffer) != -1)
{
b[i]=(byte)f.read();
i++;
}
f.close();
dsoc.send(new DatagramPacket(b,i,InetAddress.getLocalHost(),8008));
}
}
这里:
while(f.read(buffer) != -1){
b[i]=(byte)f.read();
buffer
数组长话短说:要么使用read(buffer)
要么始终使用单字节read()
。
除此之外:您还忘记检查您打算读取的文件是否适合您要传输到服务器的缓冲区!
最后:你还试图同时做*太多**的事情。 相反:专注于这项工作的不同部分,例如:
byte b[]=new byte[787734];
// ...
while(f.read(buffer) != -1){
b[i]=(byte)f.read();
i++;
}
dsoc.send(new DatagramPacket(b,i,InetAddress.getLocalHost(),8008));
这完全是胡说八道。 您最多读取 787734 个字节并将其丢弃,然后读取一个字节(如果有),然后显然尝试发送大小高达 787734 的数据报,这是不可能的。 它应该是:
byte b[]=new byte[534];
// ...
int count;
while((count = f.read(b)) != -1){
dsoc.send(new DatagramPacket(b,count,InetAddress.getLocalHost(),8008));
}
然后你必须处理重复的数据报、未收到的数据报、乱序接收的数据报,......
当您使用FileOutputStream
时调用File.exists()
和File.createNewFile()
充其量是完全浪费时间,但是当您在创建FileOutputStream
之后调用它们时,您很可能会破坏正在写入的文件,取决于平台。 消除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.