使用DatagramSocket发送、接收数据(3)---client端

转载:http://book.51cto.com/art/201203/322544.htm    (疯狂Java讲义---李刚)


程序清单:codes\17\17.4\UdpClient.java

 
 
  1. public class UdpClient  
  2. {  
  3.     // 定义发送数据报的目的地  
  4.     public static final int DEST_PORT = 30000;  
  5.     public static final String DEST_IP = "127.0.0.1";  
  6.     // 定义每个数据报的最大大小为4KB  
  7.     private static final int DATA_LEN = 4096;     
  8.     // 定义接收网络数据的字节数组  
  9.     byte[] inBuff = new byte[DATA_LEN];  
  10.     // 以指定的字节数组创建准备接收数据的DatagramPacket对象  
  11.     private DatagramPacket inPacket =   
  12.         new DatagramPacket(inBuff , inBuff.length);  
  13.     // 定义一个用于发送的DatagramPacket对象  
  14.     private DatagramPacket outPacket = null;  
  15.     public void init()throws IOException  
  16.     {  
  17.         try(  
  18.             // 创建一个客户端DatagramSocket,使用随机端口  
  19.             DatagramSocket socket = new DatagramSocket())  
  20.         {  
  21.             // 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组  
  22.             outPacket = new DatagramPacket(new byte[0] , 0  
  23.                 , InetAddress.getByName(DEST_IP) , DEST_PORT);  
  24.             // 创建键盘输入流  
  25.             Scanner scan = new Scanner(System.in);  
  26.             // 不断地读取键盘输入  
  27.             while(scan.hasNextLine())  
  28.             {  
  29.                 // 将键盘输入的一行字符串转换成字节数组  
  30.                 byte[] buff = scan.nextLine().getBytes();  
  31.                 // 设置发送用的DatagramPacket中的字节数据  
  32.                 outPacket.setData(buff);  
  33.                 // 发送数据报  
  34.                 socket.send(outPacket);  
  35.                 // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中  
  36.                 socket.receive(inPacket);  
  37.                 System.out.println(new String(inBuff , 0  
  38.                     , inPacket.getLength()));  
  39.             }  
  40.         }  
  41.     }  
  42.     public static void main(String[] args)   
  43.         throws IOException  
  44.     {  
  45.         new UdpClient().init();  
  46.     }  
  47. }  

        上面程序中的粗体字代码同样也是使用DatagramSocket发送、接收DatagramPacket的关键代码,这些代码与服务器端代码基本相似。而客户端与服务器端的唯一区别在于:服务器端的IP地址、端口是固定的,所以客户端可以直接将该数据报发送给服务器端,而服务器端则需要根据接收到的数据报来决定"反馈"数据报的目的地。

        读者可能会发现,使用DatagramSocket进行网络通信时,服务器端无须也无法保存每个客户端的状态,客户端把数据报发送到服务器端后,完全有可能立即退出。但不管客户端是否退出,服务器端都无法知道客户端的状态。

        当使用UDP协议时,如果想让一个客户端发送的聊天信息被转发到其他所有的客户端则比较困难,可以考虑在服务器端使用Set集合来保存所有的客户端信息,每当接收到一个客户端的数据报之后,程序检查该数据报的源SocketAddress是否在Set集合中,如果不在就将该SocketAddress添加到该Set集合中。这样又涉及一个问题:可能有些客户端发送一个数据报之后永久性地退出了程序,但服务器端还将该客户端的SocketAddress保存在Set集合中……总之,这种方式需要处理的问题比较多,编程比较烦琐。幸好Java为UDP协议提供了MulticastSocket类,通过该类可以轻松地实现多点广播。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值