/* 
         * 实现UDP的聊天程序 
         * 保证单一窗口的接收和发送 
         * 多线程技术实现, 
         * 主线程main,启动程序,开启两个线程,一个线程 
         * 运行接收端,一个线程运行发送端 
         * 运行的代码,封装到run方法中即可,DatagramSocket不能放在run 
         * DatagramSocket对象,在main创建完毕,传递给线程执行 
         */ 
import java.net.*; 
import java.io.*; 
 
public class WangLuoBianCheng { 
public static void main(String[] args) throws Exception{ 
        Send se=new Send(new DatagramSocket()); 
        Server sr=new Server(new DatagramSocket(8000)); 
        Thread t1=new Thread(se); 
        Thread t2=new Thread(sr); 
        t1.start(); 
        t2.start();         
 } 
} 
//定义类,实现Runnable接口,UDP的发送端 
class Send implements Runnable{ 
         private DatagramSocket ds; 
        Send(DatagramSocket ds){ 
                this.ds=ds; 
        } 
        public void run(){ 
                try{ 
                        // IO流读取键盘输入 
                BufferedReader bu=new BufferedReader(new InputStreamReader(System.in)); 
         String line=null; 
         while((line=bu.readLine())!=null){ 
                if(line.equals("886")){ 
                        break;    
                 } 
                byte[] bytes=line.getBytes(); 
                // 创建数据包对象,封装字节数组,长度,IP对象,端口号 
                DatagramPacket dp=new DatagramPacket(bytes,bytes.length,InetAddress.getByName("192.168.33.22"),8000); 
                // 调用send方法 
                ds.send(dp); 
         } 
      // 关闭资源 
                ds.close(); 
                }catch(Exception e){ 
                e.printStackTrace(); 
          } 
        } 
  } 
//定义类,实现Runnable接口,实现UDP接收端 
class Server implements Runnable{ 
        private DatagramSocket ds; 
        Server(DatagramSocket ds){ 
                this.ds=ds; 
        } 
        public void run(){ 
                try{ 
                        // 字节数组 
                        byte[] bytes=new byte[1024]; 
                        while(true){ 
                                // 创建数据包对象 
          DatagramPacket dp=new DatagramPacket(bytes,bytes.length); 
       // 调用接收端的receive方法 
          ds.receive(dp); 
          System.out.println(new String(bytes,0,dp.getLength())); 
                        } 
                }catch(Exception e){ 
                e.printStackTrace(); 
          } 
        } 
} 
 |   
        
 
    
    
    
     
 
 |