使用UDP协议完成双向聊天功能

要实现双向聊天,首先我们要开两个线程。其次因为这里只是做测试,因此我们的接收端和发送端都是本机。

首先是SendThread.java:

 1 package com.hw.UDP0226;
 2 
 3 import java.net.DatagramPacket;
 4 import java.net.DatagramSocket;
 5 import java.net.InetAddress;
 6 import java.net.SocketException;
 7 import java.util.Scanner;
 8 
 9 @SuppressWarnings("unused")
10 public class SendThread extends Thread{
11     
12     private int port;
13     public SendThread(int port){
14         this.port = port;
15     }
16     
17     public void run(){
18         DatagramSocket ds = null;
19         try {
20             ds = new DatagramSocket();
21             Scanner s = new Scanner(System.in);
22             while(true)
23             {
24                 String str = s.nextLine();
25                 byte[] buf = str.getBytes();
26                 int length = buf.length;
27                 InetAddress address = InetAddress.getByName("192.168.0.105");
28                 DatagramPacket dp = new DatagramPacket(buf, length,address,port);
29                 ds.send(dp);
30             }
31             
32         } catch (Exception e) {
33             // TODO Auto-generated catch block
34             e.printStackTrace();
35         } finally{
36             if(ds != null){
37                 ds.close();
38             }
39         }
40     }
41 }

因为是双向聊天,所以我们发送的数据都是需要用户输入的,肯定是接受用户输入内容后转化为字符串并保存到数组中。

ReceiveThread.java:

 1 package com.hw.UDP0226;
 2 
 3 import java.net.DatagramPacket;
 4 import java.net.DatagramSocket;
 5 import java.net.InetAddress;
 6 import java.net.SocketException;
 7 import java.util.Scanner;
 8 
 9 @SuppressWarnings("unused")
10 public class ReceiveThread extends Thread{
11     
12     private int port;
13     public ReceiveThread(int port){
14         this.port = port;
15     }
16     
17     public void run(){
18         DatagramSocket ds = null;
19         try {
20             ds = new DatagramSocket(port);
21             while(true)
22             {
23                 byte[] buf = new byte[1024];
24                 int length = buf.length;
25                 DatagramPacket dp = new DatagramPacket(buf,length);
26                 ds.receive(dp);
27                 String str = new String(dp.getData(),0,dp.getLength());
28                 InetAddress address = dp.getAddress();
29                 System.out.println(address+":"+str);
30             }
31 
32         } catch (Exception e) {
33             // TODO Auto-generated catch block
34             e.printStackTrace();
35         }finally{
36             if(ds != null){
37                 ds.close();
38             }
39         }
40     }
41 }

然后我们再来开发两个聊天的用户:

ChattingRoom_User1.java:

1 package com.hw.UDP0226;
2 
3 public class ChattingRoom_User1 {
4     public static void main(String[] args) {
5         new SendThread(7979).start();
6         new ReceiveThread(7980).start();
7     }
8 }

ChattingRoom_User2.java:

1 package com.hw.UDP0226;
2 
3 public class ChattingRoom_User2 {
4     public static void main(String[] args) {
5         new ReceiveThread(7979).start();
6         new SendThread(7980).start();
7     }
8 }

注意因为是双向聊天,所以需要使用两个端口号!

 

 

posted @ 2021-02-26 21:35  EvanTheBoy  阅读(353)  评论(0)    收藏  举报