Java使用UDP聊天程序

主要想测试Java UDP通信。Java UDP使用DatagramSocket和DatagramPacket完成UDP通信

主要思路:

1.本机通信,ip地址为:127.0.0.1

2.开一个线程监听一个端口

3.向端口发送消息

4.运行程序java ChatWindow desport listenport

ChatWindow.java

  1 import java.io.IOException;
  2 import java.net.DatagramPacket;
  3 import java.net.DatagramSocket;
  4 import java.net.InetAddress;
  5 import java.net.InetSocketAddress;
  6 import java.util.Scanner;
  7 
  8 /**
  9  * 聊天小程序
 10  * 使用UDP进行通信
 11  * 开一个线程,监听一个端口,接收消息
 12  * 这里主要用于本机通信,IP为127.0.0.1
 13  * 
 14  * 发送消息正常,接收消息没反应
 15  * @author GXF
 16  *
 17  */
 18 public class ChatWindow {
 19     private int listenPort;                    //监听端口
 20     private int desPort;                    //目标端口
 21     
 22     /**
 23      * 初始化目的端口和监听端口
 24      * @param desPort
 25      * @param listenPort
 26      */
 27     public ChatWindow(int desPort, int listenPort){
 28         this.desPort = desPort;
 29         this.listenPort = listenPort;
 30         
 31         //启动监听线程
 32         Thread listenMessageThread = new Thread(new ReceiveMessage());
 33         listenMessageThread.start();
 34         
 35         System.out.println("程序已启动,愉快的开始聊天吧!");
 36         //接收用户输入的消息
 37         Scanner scanner = new Scanner(System.in);
 38         while(true){
 39             String message = scanner.nextLine();
 40             sendMessag(message);
 41         }
 42     }
 43     
 44     /**
 45      * 向目的端口发送一个消息
 46      * @param message
 47      */
 48     public void sendMessag(String message){
 49         //初始化一个socket
 50         //设置好数据包
 51         //发送消息
 52         try {
 53             DatagramSocket socketToSendMessage = new DatagramSocket();
 54             byte buff[] = message.getBytes();
 55             DatagramPacket packetToSend = new DatagramPacket(buff, buff.length, InetAddress.getByName("127.0.0.1"), desPort);
 56             socketToSendMessage.send(packetToSend);                                         //发送消息
 57             socketToSendMessage.close();                                                    //关闭socket
 58         } catch (Exception e) {
 59             e.printStackTrace();
 60         }
 61     }
 62     
 63     
 64     /**
 65      * 监听端口线程
 66      * 实例化一个DatagramSocket,并绑定一个端口进行监听
 67      * @author GXF
 68      *
 69      */
 70     class ReceiveMessage implements Runnable{
 71         private DatagramSocket listenSocket;
 72         private DatagramPacket receivePacket;
 73         private byte buff[] = new byte[1024];
 74         @Override
 75         public void run() {
 76             //init
 77             init();
 78             //start 监听
 79             while(true){
 80                 try {
 81                     listenSocket.receive(receivePacket);                    //接收数据包
 82                     String receiveMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
 83                     System.out.println(receiveMessage);                        //输出接收到的消息
 84                 } catch (IOException e) {
 85                     e.printStackTrace();
 86                 }
 87             }
 88             
 89         }
 90         
 91         /**
 92          * 对socket,端口,进行初始化
 93          */
 94         public void init(){
 95             try {                
 96                 InetSocketAddress serverSocketAddress = new InetSocketAddress(listenPort);
 97                 listenSocket = new DatagramSocket(serverSocketAddress);    
 98                 receivePacket = new DatagramPacket(buff, buff.length);                
 99             } catch (Exception e) {
100                 e.printStackTrace();
101             }
102         }
103     }
104 
105     public static void main(String[] args) {
106         if(args.length != 2)
107         {
108             System.out.println("usage: java ChatWindow desport listenport");
109             return;
110         }
111         int desport = Integer.valueOf(args[0]);
112         int listenPort = Integer.valueOf(args[1]);
113         //first is desport, seconde is listenport
114         ChatWindow chatWindow = new ChatWindow(desport, listenPort);
115         
116 
117     }
118 
119 }
原文地址:https://www.cnblogs.com/luckygxf/p/4929275.html