Java网络编程四 非阻塞通信UDP

转自 http://blog.csdn.net/alangdangjia/article/details/9065845

  1. import java.io.BufferedReader;  
  2.  import java.io.ByteArrayInputStream;  
  3.  import java.io.DataInputStream;  
  4.  import java.io.IOException;  
  5.  import java.io.InputStreamReader;  
  6.  import java.net.DatagramSocket;  
  7.  import java.net.InetSocketAddress;  
  8.  import java.nio.ByteBuffer;  
  9.  import java.nio.channels.DatagramChannel;  
  10.  import java.nio.channels.SelectionKey;  
  11.  import java.nio.channels.Selector;  
  12.  import java.util.Set;  
  13.   
  14.  public class NioUdpServer {  
  15.   
  16.      public static void main(String[] args) {  
  17.          try {  
  18.              Selector selector = Selector.open();  
  19.              DatagramChannel channel = DatagramChannel.open();  
  20.              channel.configureBlocking(false);  
  21.              DatagramSocket socket = channel.socket();  
  22.              socket.bind(new InetSocketAddress(1000));  
  23.              channel.register(selector, SelectionKey.OP_READ);  
  24.                
  25.             ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);  
  26.              final int PACKAGE_SIZE = 10;  
  27.              while(true){  
  28.                  int n = selector.select();  
  29.                  if(n == 0){  
  30.                      continue;  
  31.                  }  
  32.                  Set<SelectionKey> readyKeys = selector.selectedKeys();  
  33.                  for(SelectionKey key : readyKeys){  
  34.                      readyKeys.remove(key);  
  35.                        
  36.                     if(key.isReadable()){  
  37.                          DatagramChannel dc = (DatagramChannel)key.channel();  
  38.                          InetSocketAddress client = (InetSocketAddress)dc.receive(receiveBuffer); //接收来自任意一个Client的数据报  
  39.                          key.interestOps(SelectionKey.OP_READ);  
  40.                            
  41.                         System.out.println("client ----> IP: " + client.getAddress().getHostAddress() + ", port: " + client.getPort());  
  42.                          System.out.println("receiveBuffer.position() = " + receiveBuffer.position());  
  43.                          if(receiveBuffer.position() >= PACKAGE_SIZE){  
  44.                              receiveBuffer.flip();  
  45.                              DataInputStream dis = new DataInputStream(new ByteArrayInputStream(receiveBuffer.array()));  
  46.                              System.out.println(dis.readInt());  
  47.                              BufferedReader d = new BufferedReader(new InputStreamReader(dis));  
  48.                              System.out.println(d.readLine());  
  49.                                
  50.                             receiveBuffer.clear();  
  51.                          }else{  
  52.                              dc.register(selector, SelectionKey.OP_READ);  
  53.                          }  
  54.                      }//if  
  55.                  }  
  56.              }//while  
  57.          } catch (IOException e) {  
  58.              e.printStackTrace();  
  59.          }  
  60.   
  61.      }  
  62.   
  63.  }  


2. 客户端

[java]  view plain  copy
  1. import java.net.DatagramPacket;  
  2. import java.net.DatagramSocket;  
  3. import java.net.InetAddress;  
  4. import java.net.UnknownHostException;  
  5.   
  6. public class NioUdpClient extends Thread {  
  7.     private byte[] sendData;  
  8.     private InetAddress serverAddr;  
  9.     private int port;  
  10.     private int dataLen;  
  11.       
  12.     public NioUdpClient(InetAddress ip, int port, byte[] str,int len) {  
  13.         this.serverAddr = ip;  
  14.         this.sendData = str;  
  15.         this.dataLen = len;  
  16.         this.port = port;  
  17.     }  
  18.       
  19.     public static void main(String[] args) {  
  20.   
  21. //      //测试字符串  
  22.         byte[] bys = new byte[256];  
  23.         for(int i = 0; i < 256; i++){  
  24.             bys[i] = (byte) i;  
  25.         }  
  26.         for(int i = 0; i < bys.length; i++){  
  27.             System.out.println(i + "--->" + bys[i]);  
  28.         }  
  29.         while(true){  
  30.             try {  
  31.                 new Thread(new NioUdpClient(InetAddress.getLocalHost(), 1000, bys,256)).start();  
  32.             } catch (UnknownHostException e) {  
  33.                 // TODO Auto-generated catch block  
  34.                 e.printStackTrace();  
  35.             }  
  36.             Thread.currentThread();  
  37.             try {  
  38.                 Thread.sleep(200);  
  39.             } catch (InterruptedException e) {  
  40.                 // TODO Auto-generated catch block  
  41.                 e.printStackTrace();  
  42.             }  
  43.         }  
  44.     }  
  45.       
  46.   
  47.     public void run() {  
  48.           
  49.         try {  
  50.   
  51.             System.out.println("Client: Start connecting\n");  
  52.             DatagramSocket socket = new DatagramSocket();  
  53.   
  54.             DatagramPacket packet = new DatagramPacket(sendData, dataLen, serverAddr, port);  
  55.             System.out.println("Client: Sending "+dataLen+"bytes'" + new String(sendData) + "'\n");  
  56.             socket.send(packet);  
  57.             System.out.println("Client: Message sent\n");  
  58.             System.out.println("Client: Succeed!\n");  
  59.         } catch (Exception e) {  
  60.             System.out.println("Client: Error!\n");  
  61.         }  
  62.     }  
  63. }  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值