Java UDP使用Socket进行网络聊天(2)之群聊版

作者 : 卿笃军

原文地址:http://blog.csdn.net/qingdujun/article/details/39312241

 

本文演示,使用Socket进行网络聊天之群聊,实现客户端给"局域网"网段里面的所以机器发送广播,当发送“886”的时候,表示客户端关闭。

1)客户端,给服务器发送数据,发送“886”表示关闭客户端。

2)服务器,一直监听9527端口,将监听到的数据打印在控制台上。

3)客户端+服务器版本,实现既可以发送数据,又可以接受数据的多线程聊天程序。

需要注意的几点是:1)这里是给局域网发送广播。  2)局域网广播地址:192.168.1.255  3)如果弹出Exception in thread "main" java.net.BindException: Address already in use: Cannot bind 问题,请换一个端口号(该端口号还没有被释放)。

 

一、客户端:主要使用了从键盘录入,和当发送“886”数据包的时候,关闭客户端。

  1. package udp.send2.qdj;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStreamReader;  
  5. import java.net.DatagramPacket;  
  6. import java.net.DatagramSocket;  
  7. import java.net.InetAddress;  
  8.   
  9. public class CUdpSend2 {  
  10.   
  11.     public static void main(String[] args) throws Exception {  
  12.         //从本机1234端口发送数据  
  13.         DatagramSocket ds = new DatagramSocket(1234);  
  14.         //从键盘录入  
  15.         BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  
  16.         String line = null;  
  17.         while ((line=bufr.readLine())!=null)  
  18.         {  
  19.             if ("886".equals(line))  
  20.                 break;  
  21.             byte[] buf = line.getBytes();  
  22.             //将数据打包,发送到对法机器的9527端口  
  23.             DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.254"),9527);  
  24.             //发送数据  
  25.             ds.send(dp);  
  26.         }  
  27.         //关闭资源  
  28.         ds.close();  
  29.     }  
  30. }  

二、服务器端,主要是一直监听9527端口,并将监听到的数据打印到控制台上。

1)控制台可以拖放出来,如果需要放进去点击"最小化"左边那个的最下面那个选项就可以。

2)切换控制台,可以点击"最小化"左边第2个选项。

  1. package udp.rece2.qdj;  
  2.   
  3. import java.net.DatagramPacket;  
  4. import java.net.DatagramSocket;  
  5.   
  6. public class CUdpRece2 {  
  7.   
  8.     public static void main(String[] args) throws Exception{  
  9.         //监听9527端口  
  10.         DatagramSocket ds = new DatagramSocket(9527);  
  11.           
  12.         while (true)  
  13.         {  
  14.             byte[] buf = new byte[1024];  
  15.             //定义一个数据包  
  16.             DatagramPacket dp = new DatagramPacket(buf, buf.length);  
  17.             //接受数据包  
  18.             ds.receive(dp);  
  19.             //提取数据  
  20.             String ip = dp.getAddress().getHostAddress();  
  21.             String data = new String(dp.getData(),0,dp.getLength());  
  22.             System.out.println("ip号:"+ip+"\n数据data:"+data);  
  23.         }  
  24.     }  
  25. }  

三、综合上述,编写一个既可以接受又可以发送的多线程群聊程序:

  1. package udp.chat.qdj;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStreamReader;  
  5. import java.net.DatagramPacket;  
  6. import java.net.DatagramSocket;  
  7. import java.net.InetAddress;  
  8.   
  9. //发送端  
  10. class Send implements Runnable  
  11. {  
  12.     private DatagramSocket ds;  
  13.     public Send(DatagramSocket s)  
  14.     {  
  15.         ds = s;  
  16.     }  
  17.     public void run() {  
  18.         try {  
  19.             //从键盘录入  
  20.             BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  
  21.             String line = null;  
  22.             while ((line=bufr.readLine())!=null)  
  23.             {  
  24.                 if ("886".equals(line))  
  25.                     break;  
  26.                 byte[] buf = line.getBytes();  
  27.                 //将数据打包,发送到对法机器的5656端口   //局域网广播地址:192.168.1.255  
  28.                 DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("10.100.56.210"),5656);  
  29.                 //发送数据  
  30.                 ds.send(dp);  
  31.             }  
  32.         } catch (Exception e) {  
  33.             throw new RuntimeException("发送端失败");  
  34.         }  
  35.           
  36.     }  
  37. }  
  38. //接收端  
  39. class Rece implements Runnable  
  40. {  
  41.     private DatagramSocket ds;  
  42.     public Rece(DatagramSocket s)  
  43.     {  
  44.         ds = s;  
  45.     }  
  46.     public void run() {  
  47.         try {  
  48.             while (true)  
  49.             {  
  50.                 byte[] buf = new byte[1024];  
  51.                 //定义一个数据包  
  52.                 DatagramPacket dp = new DatagramPacket(buf, buf.length);  
  53.                 //接受数据包  
  54.                 ds.receive(dp);  
  55.                 //提取数据  
  56.                 String ip = dp.getAddress().getHostAddress();  
  57.                 String data = new String(dp.getData(),0,dp.getLength());  
  58.                 System.out.println(ip+":"+data);  
  59.             }  
  60.         } catch (Exception e) {  
  61.             throw new RuntimeException("接受端失败");  
  62.         }  
  63.     }  
  64. }  
  65.   
  66. public class CUdpChat {  
  67.   
  68.     public static void main(String[] args) throws Exception{  
  69.         //发送端可以不指定端口,系统随机分配一个  
  70.         DatagramSocket sendSocket = new DatagramSocket();  
  71.         DatagramSocket receSocket = new DatagramSocket(5656);  
  72.         //开启多线程  
  73.         new Thread(new Send(sendSocket)).start();  
  74.         new Thread(new Rece(receSocket)).start();  
  75.     }  
  76. }  

显示界面:


参考文献: Java视频 毕向东 主讲

原文地址:http://blog.csdn.net/qingdujun/article/details/39312241

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。