关于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);"里就停住运行不下去了,为什么啊,求高手解答啊~~~快要交了= = 谢谢大家啦~~~ 展开
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);"里就停住运行不下去了,为什么啊,求高手解答啊~~~快要交了= = 谢谢大家啦~~~ 展开
5个回答
展开全部
我试了一下可以运行,错误见注释
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();
}
}
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(某个官方标准)。
展开全部
我试了一下可以运行,请参阅附注
进口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();}
}
进口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();}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
receive()是一个阻塞方法!一定要等到发送端发送到数据过来
更多追问追答
追问
我运行了发送端选择文件发送后,再运行接受端就是不行啊.........
追答
你应该先开接收端啊!!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发送端有发送数据吗?
追问
有啊,我运行了一下选择一个文件发送啦。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询