繁体   English   中英

使用UDP传输文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM