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

//////////发送端packagecom.qq.client.model;importjava.io.FileInputStream;importjava.io.I... //////////发送端
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);"里就停住运行不下去了,为什么啊,求高手解答啊~~~快要交了= = 谢谢大家啦~~~
展开
 我来答
百度网友ee21c88
2012-04-02 · TA获得超过5319个赞
知道小有建树答主
回答量:619
采纳率:0%
帮助的人:726万
展开全部
我试了一下可以运行,错误见注释
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("tmp/temp.dat");
dp =new DatagramPacket(buf,buf.length);
while(true){
//这个地方改成我这样
if (dp.getData().length != 0) {
ds.receive(dp);
System.out.print(dp.getData().length);
fos.write(dp.getData());
fos.flush();
//你的while(true)是个死循环,虽然已经接收到了但是没法循环出去,需要一个break或者把true换成你收的文件长度不等于0
break;
}

}
} 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("tmp/temp.dat");
int c;
while((c=fis.read(buf))!= -1){
fos.write(buf);
fos.flush();
}
fos.close();
fis.close();
}catch (IOException e1){
e1.printStackTrace();
}
}

public static void main(String args[]){
new UServer();
}
}
更多追问追答
追问
谢谢,我刚运行了一下,原来要先运行UServer ,再运行UClient的= =,但是只能发送接受10KB啊?为什么?
追答
信息受带宽影响很大,你每个数据包太多的话会发生丢包,类似于网络游戏里面卡得失帧,其实我建议你把包的大小再弄小点,最好不要超过1500B(某个官方标准)。
赵大先生
2013-03-13 · TA获得超过3357个赞
知道小有建树答主
回答量:1.2万
采纳率:12%
帮助的人:2341万
展开全部
我试了一下可以运行,请参阅附注
进口java.io.FileInputStream;

进口java.io.FileOutputStream;

进口java.io.IOException异常;

进口Java错误。 net.DatagramPacket;

进口java.net.DatagramSocket;进口java.net.SocketException

进口javax.swing.JFileChooser;

私人DatagramPacket类DP / /数据报文包

私人DatagramSocket的DS类UServer {/ /数据报套接字

私人字符串的文件名; / /保存选择文件名

私人的FileInputStream FIS / /输入流中读取磁盘文件

私人写入FileOutputStream fos基因;

私人字节[]缓冲区=新的字节[10240] / /字节数组来存储文件读公共UServer (){

尝试{

DS =新的DatagramSocket(4567);

FOS =新的文件输出流(“tmp / temp.dat中”);

DP =新的DatagramPacket(buf中, buf.length);

而(真){

/ /这个地方改变了我

(dp.getData()。长度!= 0){

ds.receive (DP);

System.out.print(dp.getData长度);

fos.write(dp.getData());

FOS的flush(); /> / /而(真)是一个循环,已收到但周期不能出去,你需要休息一下,或者你收到的文件所代替的真实长度不等于0

休息;

}

}

}赶上(例外五){

e.printStackTrace();

}

文件选择用户界面=新选择JFileChooser();

jfc.showSaveDialog(NULL);

文件名= jfc.getSelectedFile()。 getPath();

尝试{

fos.close();

FOS =新的文件输出流(文件名);

FIS =新的文件输入流(“tmp / temp.dat中”);

诠释;

((C = fis.read(BUF))!= -1){

fos.write(缓冲区);

fos.flush();

}

fos.close();

裂变。关闭();

}赶上(IOException异常E1){

e1.printStackTrace();

}

}

公共静态无效的主要(字符串参数[]){

新UServer();}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友752e907
2012-04-01 · TA获得超过513个赞
知道小有建树答主
回答量:809
采纳率:50%
帮助的人:448万
展开全部
receive()是一个阻塞方法!一定要等到发送端发送到数据过来
更多追问追答
追问
我运行了发送端选择文件发送后,再运行接受端就是不行啊.........
追答
你应该先开接收端啊!!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友845f74e61
2012-04-01 · TA获得超过6929个赞
知道大有可为答主
回答量:4050
采纳率:50%
帮助的人:1618万
展开全部
发送端有发送数据吗?
追问
有啊,我运行了一下选择一个文件发送啦。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沈超凡521
2012-04-01
知道答主
回答量:20
采纳率:0%
帮助的人:3.2万
展开全部
。。。。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式