用UDP协议实现文件传输

Syler_yu 2010-12-18 02:32:12
是课堂的作业,必须用UDP协议实现文件传输,不需要GUI实现,控制台就好~我是小菜鸟,刚入门,写了如下两个UDPServer.java和UDPClient.java,前者错误在socket.close();后者错误在os.close(); 不知道为什么错了,编译不过,所以也不知道自己写的对不对,请各位帮忙修改!感谢!

import java.net.*;
import java.io.*;
import java.lang.*;

public class UDPServer{
public static void main(String args[]){
DatagramSocket socket=null;
DatagramPacket packet=null;
InetAddress address=null;//用来存放接收方的地址
DataInputStream in=null;
int port=0;//用来存放接收方的端口号

try
{
socket=new DatagramSocket(8888);
in=new DataInputStream(new FileInputStream("e:\\text.txt"));
while(true)
{
byte[] buf=new byte[256];//存放从客户端接收的请求信息
packet=new DatagramPacket(buf,buf.length);//用来从socket接收数据
socket.receive(packet);//在客户的请求报到来之前一直等待

byte b[]=new byte[1];
address=packet.getAddress();//从到来的包中得到地址
port=packet.getPort();//从到来的包中得到端口号
packet=new DatagramPacket(b,b.length,address,port);//建立报文包,用来从socket上发送信息
socket.send(packet);//发送数据包
}//while
socket.close();
} catch(Exception e){
System.out.println("Error:"+e);
} //catch
} //main
} //public class


import java.net.*;
import java.io.*;
import java.lang.*;

public class UDPClient{
public static void main(String args[]){
if (args.length<1){
System.out.println("Please input the Server Address and Port!");
System.out.println("see also: localhost 8888");
System.exit(1);
}

DatagramSocket socket=null;
DataOutputStream os=null;
int port=0;
InetAddress address=null;
DatagramPacket packet=null;
byte[] sendBuf=new byte[256];

try{
while(true){
socket=new DatagramSocket();//建立socket
os=new DataOutputStream(new FileOutputStream("e:\\text.txt"));
address=InetAddress.getByName(args[0]);
port=Integer.parseInt(args[1]);
packet=new DatagramPacket(sendBuf,sendBuf.length,address,port);
socket.send(packet);//向服务器发出请求报文

packet=new DatagramPacket(sendBuf,sendBuf.length);
socket.receive(packet);//客户机等待应带,若没有就一直等待

String received=new String(packet.getData(),0);
System.out.println(received);//处理接收到的数据
}//while
os.close();
socket.close();
}catch(Exception e){
System.out.println("Error:"+e);
} //catch
}//main
}//public class
...全文
517 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Syler_yu 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 teaerror 的回复:]
在正常情况下不可能有反应的,因为你的程序完全不知道要干什么,Server和Client混乱,Input和Output也混乱,你不说功能也没法帮你改。
[/Quote]
嘿~我的程序只是想实现一个文件text.txt的传输,使用的是UDP协议就可以;能麻烦您帮忙修改下?谢谢!
Teaerror 2010-12-18
  • 打赏
  • 举报
回复
在正常情况下不可能有反应的,因为你的程序完全不知道要干什么,Server和Client混乱,Input和Output也混乱,你不说功能也没法帮你改。
Syler_yu 2010-12-18
  • 打赏
  • 举报
回复
补充个问题,我按照上面几位的建议,已经把程序修改可以编译通过了;但是在控制台运行起来似乎没什么反应,我想请教,这样的UDP协议传输文件,实现的结果应该是什么样?是真的能把一个文件传了过去吗?求详解,谢谢!
Syler_yu 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xinfei0803 的回复:]
把socket.close();os.close(); 都删了,不要了,然后改两句话
把原来的os=new DataOutputStream(new FileOutputStream("e:\\text.txt"));
改成
File f = new File("e:\\text.txt");
if(!f.exists()){
f.createNewFile();
}
……
[/Quote]

恩,只是我目前正在入门,赶着作业,近期要换eclipse使用,谢谢建议!
Syler_yu 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 unbaochen 的回复:]
因为close写在一个死循环后面是永远执行不了的,所以就报错了。
[/Quote]
顿悟顿悟啊!!谢谢!
冰思雨 2010-12-18
  • 打赏
  • 举报
回复
楼主在编程的时候,采用了死循环的循环体。
也就是while(true){}语句,这个,与类似goto的跳转语句一样,是不推荐使用的。

死循环,后面的语句,一般来讲是无法执行到的。
所以,编译环境,很可能会报错。
并不是说,socket.close();语句不该使用,而是说,你写了代码,但是,无法执行到这个代码。

其他方面,我并没有查看。比如,丢包重传什么的功能。
xinfei0803 2010-12-18
  • 打赏
  • 举报
回复
把socket.close();os.close(); 都删了,不要了,然后改两句话
把原来的os=new DataOutputStream(new FileOutputStream("e:\\text.txt"));
改成
File f = new File("e:\\text.txt");
if(!f.exists()){
f.createNewFile();
}
in=new DataInputStream(new FileInputStream(f));

客户服务器端都改。然后就可以通过编译运行。在开发时最好使用eclipse或netbeans等ide工具,这些可以提供很多修改建议,省时省力。
unbaochen 2010-12-18
  • 打赏
  • 举报
回复
因为close写在一个死循环后面是永远执行不了的,所以就报错了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧