//发送端 package com.qq.client.model; import java.io.FileInputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; import javax.swing.JFileChooser; public class UClient { private DatagramPacket dp; //数据报包 private DatagramSocket ds; //数据报socket private String filename; //保存选择的文件的名字 private FileInputStream fis; //输入流,用来读取磁盘文件 byte[] buf=new byte[10240]; //字节数组,存放读取的文件 public UClient(){ try { ds = new DatagramSocket(1234); //首先启动Socket } catch (SocketException e) { e.printStackTrace(); } JFileChooser jfc =new JFileChooser();//文件选择器组件 jfc.showOpenDialog(null); filename=jfc.getSelectedFile().getPath();//获得文件路径和名字 try{ fis=new FileInputStream(filename); int c; while((c=fis.read(buf))!= -1){ //读文件数据存入buf字节数组 //利用buf做数据报包 dp=new DatagramPacket(buf,c, new InetSocketAddress("127.0.0.1",4567)); ds.send(dp); //发送出去 } fis.close(); }catch(IOException e2){ e2.printStackTrace(); } } } /接收端 package com.qq.client.model; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import javax.swing.JFileChooser; public class UServer { private DatagramPacket dp; //数据报包 private DatagramSocket ds; //数据报socket private String filename; //保存选择的文件的名字 private FileInputStream fis; //输入流,用来读取磁盘文件 private FileOutputStream fos; private byte[] buf=new byte[10240]; //字节数组,存放读取的文件 public UServer(){ try { ds = new DatagramSocket(4567); fos=new FileOutputStream("c:\\temp.dat"); while(true){ dp =new DatagramPacket(buf,buf.length); while (dp.getData().length != 0) { ds.receive(dp); fos.write(dp.getData()); } fos.flush(); } } catch (Exception e) { e.printStackTrace(); } JFileChooser jfc=new JFileChooser(); jfc.showSaveDialog(null); filename=jfc.getSelectedFile().getPath(); try{ fos.close(); fos=new FileOutputStream(filename); fis=new FileInputStream("c:\\temp.dat"); int c; while((c=fis.read(buf))!= -1){ fos.write(buf); fos.flush(); } fos.close(); fis.close(); }catch (IOException e1){ e1.printStackTrace(); } } } / 这个是我要做的课程设计,用java做一个QQ,发送接收信息是TCP做的,所以发送和接受文件想用udp做,现在的问题是:我老是在运行接受端的"ds.receive(dp);"里就停住运行不下去了,为什么啊,求高手解答啊~~~快要交了= = 谢谢大家啦~~~
//发送端 byte[] buf=new byte[1024]; //数组产度改成1024 public UClient(){ .. int off = 0;//文件字节指针 while((c=fis.read(buf, off, buf.length))!= -1){ //从off开始读1024个字节存入buf字节数组 //利用buf做数据报包 dp=new DatagramPacket(buf,c, new InetSocketAddress("127.0.0.1",4567)); off+=buf.length;//指针递加1024 ds.send(dp); //发送出去 } ... } 然后Userver那边你再改一下 当收到第一个UDP包的时候就让开始写文件 这个地方我觉得你没必要让用户自己选择文件名,你保留原来的文件名就是了,比方说你在客户端先发一个udp包,里面的内容是文件名。 最后发一个判断所有包发送结束的字节,比如最后发一个“end”过去,你break的条件改成buf的内容是不是equals(“end”)就行了,具体函数解释你可以查一下java api