我编写了一个程序,用于将文件从客户端传输到服务器端。该程序运行没有任何错误。此外,文件也在目标路径上创建。但是当我尝试打开文件时,gedit会崩溃。该程序应该传输音频,视频,文本文件。我知道UDP不应该用于传输文件,因为它可能已损坏,但我必须将其作为分配。以下代码用于文本文件传输。
Server.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();
}
}
Client.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));
}
}
答案 0 :(得分:0)
下面:
while(f.read(buffer) != -1){
b[i]=(byte)f.read();
buffer
数组长话短说:使用read(buffer)
或始终使用单字节read()
。
除此之外:您还忘记检查您要阅读的文件是否适合您要传输到服务器的缓冲区!
最后:你也试图同时做太多**事情。相反:关注这项工作的不同部分,例如:
答案 1 :(得分:0)
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));
}
然后你必须处理重复的数据报,未收到的数据报,无序接收的数据报,......
当您使用File.exists()
时调用File.createNewFile()
和FileOutputStream
完全是浪费时间,但是在创建后调用时FileOutputStream
您可能会破坏正在写入的文件,具体取决于平台。删除。