使用UDP进行文件传输

时间:2017-10-24 09:23:16

标签: java sockets udp

我编写了一个程序,用于将文件从客户端传输到服务器端。该程序运行没有任何错误。此外,文件也在目标路径上创建。但是当我尝试打开文件时,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));
            }

}

2 个答案:

答案 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您可能会破坏正在写入的文件,具体取决于平台。删除。