关于java用udp发送文件的问题...

//发送端
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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值