Java模拟UDP通信示例代码
Java基础:模拟UDP通信
1、一次发送,一次接收
1.1、发送方
//发送端,不需要连接服务器
publicclassUdpClientDemo{
publicstaticvoidmain(String[]args)throwsException{
//1.发送数据包需要一个Socket
DatagramSocketsocket=newDatagramSocket();
//1.2建立一个包
Stringmsg="你好";
InetAddresslocalhost=InetAddress.getByName("localhost");
System.out.println(localhost);
intport=8080;
/*
通过UDP发送消息,需要通过包来发送,-->DatagramPacket(),该方法有多种重载形式,以下使用参数列表最多的那个
参数:
-要发送的消息的字节数组
-从字节数组的哪个位置开始发送
-发送的长度
-对方的IP地址
-对方的端口号
*/
DatagramPacketpacket=newDatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
//2.发送数据包
socket.send(packet);
socket.close();
}
}
1.2、接收方
//接收端,接收端需要保证存在,否则接收不到,所以需要提前开启
publicclassUdpServerDemo{
publicstaticvoidmain(String[]args)throwsException{
//1.接收也需要一个Socket,并且要开启接收的端口
DatagramSocketsocket=newDatagramSocket(8080);
//需要一个字节数组来接收数据
byte[]buffer=newbyte[1024];
//1.2封装数据包
DatagramPacketpacket=newDatagramPacket(buffer,0,buffer.length);
//2.接收数据,阻塞式接收:一直处于监听状态
socket.receive(packet);
//关闭套接字
socket.close();
//输出一下
System.out.println(packet.getAddress().getHostAddress());
//trim():为了去除多余的空格
System.out.println(newString(packet.getData()).trim());
}
}
2、多次发送,多次接收
一方多次发送,一方多次接收,加上一个while(true){}死循环,并规定在什么情况下退出即可。
2.1、发送方
publicclassChatSenderDemo{
publicstaticvoidmain(String[]args)throwsException{
//使用Socket来接收
DatagramSocketsocket=newDatagramSocket();
while(true){
//准备发送包裹,从键盘接收数据
BufferedReaderreader=newBufferedReader(newInputStreamReader(System.in));
//读取一行
Stringdata=reader.readLine();
byte[]dataBytes=data.getBytes();
DatagramPacketpacket=newDatagramPacket(dataBytes,dataBytes.length,newInetSocketAddress("127.0.0.1",6666));
//发送
socket.send(packet);
//什么时候退出
if("bye".equals(data)){
break;
}
}
//关闭
socket.close();
}
}
2.2、接收方
publicclassChatReceiveDemo{
publicstaticvoidmain(String[]args)throwsException{
DatagramSocketsocket=newDatagramSocket(6666);
while(true){
//准备接收数据包裹
byte[]buffer=newbyte[1024];
//用来接收数据
DatagramPacketpacket=newDatagramPacket(buffer,0,buffer.length);
//接收包裹,阻塞时接收
socket.receive(packet);
//接收到的数据
StringreceiveData=newString(packet.getData()).trim();
//打印到控制台
System.out.println(receiveData);
//什么时候退出
if("bye".equals(receiveData)){
break;
}
}
//关闭
socket.close();
}
}
3、模拟双方通信
模拟双方使用UDP通信,需要开启两个线程,并对以上代码进行【共性提取】,进一步进行抽象。
由此,双方可以通过指定的端口来互相发送消息。
3.1、发送方的线程
//开启多线程需要实现Runnable接口,实现run()方法
publicclassTalkSenderimplementsRunnable{
//网络套接字,发送需要
DatagramSocketsocket=null;
//缓冲读取流
BufferedReaderreader=null;
//开启哪个端口接收
privateintfromPort;
//对方的IP
privateStringtoIP;
//对方的端口
privateinttoPort;
//通过构造方法进行初始化
publicTalkSender(intfromPort,StringtoIP,inttoPort){
this.fromPort=fromPort;
this.toIP=toIP;
this.toPort=toPort;
try{
socket=newDatagramSocket(fromPort);
}catch(SocketExceptione){
e.printStackTrace();
}
}
//重写run()方法,设置线程任务
@Override
publicvoidrun(){
while(true){
Stringdata=null;
try{
//准备发送包裹,从键盘接收数据
reader=newBufferedReader(newInputStreamReader(System.in));
//读取一行
data=reader.readLine();
byte[]dataBytes=data.getBytes();
DatagramPacketpacket=newDatagramPacket(dataBytes,dataBytes.length,newInetSocketAddress(toIP,toPort));
socket.send(packet);
}catch(IOExceptione){
e.printStackTrace();
}
//什么时候退出
if("bye".equals(data)){
break;
}
}
//关闭
socket.close();
}
}
3.2、接收方的线程
publicclassTalkReveicerimplementsRunnable{
DatagramSocketsocket=null;
//从哪个端口接收
privateintformPort;
//发送方是谁
privateStringwho;
publicTalkReveicer(intformPort,Stringwho){
this.formPort=formPort;
this.who=who;
try{
socket=newDatagramSocket(formPort);
}catch(SocketExceptione){
e.printStackTrace();
}
}
@Override
publicvoidrun(){
while(true){
StringreceiveData=null;
try{
//准备接收数据包裹
byte[]buffer=newbyte[1024];
//接收数据
DatagramPacketpacket=newDatagramPacket(buffer,0,buffer.length);
//接收数据,阻塞式
socket.receive(packet);
//接收到的数据
receiveData=newString(packet.getData());
System.out.println(who+":"+receiveData.trim());
}catch(IOExceptione){
e.printStackTrace();
}
//什么时候退出
if("bye".equals(receiveData)){
break;
}
}
//关闭
socket.close();
}
}
3.3、模拟学生
//学生端
publicclassTalkStudent{
publicstaticvoidmain(String[]args){
//开启5555端口,发送到本机的6666端口
newThread(newTalkSender(5555,"localhost",6666)).start();
//规定使用7777端口接收老师发送的消息
newThread(newTalkReveicer(7777,"老师")).start();
}
}
3.4、模拟老师
//教师端
publicclassTalkTeacher{
publicstaticvoidmain(String[]args){
//开启8888端口,发送到本机的7777端口
newThread(newTalkSender(8888,"localhost",7777)).start();
//规定使用6666端口接收学生发送的消息
newThread(newTalkReveicer(6666,"学生")).start();
}
}
总结:
使用UDP通信,其实主要的步骤分为三步:
1 用DatagramSocket()来开启端口,通过开启端口聊天。
2 用DatagramPacket()来发送或者接收数据。
3 关闭DatagramSocket,释放资源。
以上就是Java模拟UDP通信示例代码的详细内容,更多关于Java模拟UDP通信的资料请关注毛票票其它相关文章!