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通信的资料请关注毛票票其它相关文章!