Java网络编程四 非阻塞通信UDP
来源:互联网 发布:周润发 知乎 编辑:程序博客网 时间:2024/05/17 00:14
转自 http://blog.csdn.net/alangdangjia/article/details/9065845
- import java.io.BufferedReader;
- import java.io.ByteArrayInputStream;
- import java.io.DataInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.DatagramSocket;
- import java.net.InetSocketAddress;
- import java.nio.ByteBuffer;
- import java.nio.channels.DatagramChannel;
- import java.nio.channels.SelectionKey;
- import java.nio.channels.Selector;
- import java.util.Set;
-
- public class NioUdpServer {
-
- public static void main(String[] args) {
- try {
- Selector selector = Selector.open();
- DatagramChannel channel = DatagramChannel.open();
- channel.configureBlocking(false);
- DatagramSocket socket = channel.socket();
- socket.bind(new InetSocketAddress(1000));
- channel.register(selector, SelectionKey.OP_READ);
-
- ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);
- final int PACKAGE_SIZE = 10;
- while(true){
- int n = selector.select();
- if(n == 0){
- continue;
- }
- Set<SelectionKey> readyKeys = selector.selectedKeys();
- for(SelectionKey key : readyKeys){
- readyKeys.remove(key);
-
- if(key.isReadable()){
- DatagramChannel dc = (DatagramChannel)key.channel();
- InetSocketAddress client = (InetSocketAddress)dc.receive(receiveBuffer);
- key.interestOps(SelectionKey.OP_READ);
-
- System.out.println("client ----> IP: " + client.getAddress().getHostAddress() + ", port: " + client.getPort());
- System.out.println("receiveBuffer.position() = " + receiveBuffer.position());
- if(receiveBuffer.position() >= PACKAGE_SIZE){
- receiveBuffer.flip();
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(receiveBuffer.array()));
- System.out.println(dis.readInt());
- BufferedReader d = new BufferedReader(new InputStreamReader(dis));
- System.out.println(d.readLine());
-
- receiveBuffer.clear();
- }else{
- dc.register(selector, SelectionKey.OP_READ);
- }
- }
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
-
- }
2. 客户端
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- import java.net.UnknownHostException;
-
- public class NioUdpClient extends Thread {
- private byte[] sendData;
- private InetAddress serverAddr;
- private int port;
- private int dataLen;
-
- public NioUdpClient(InetAddress ip, int port, byte[] str,int len) {
- this.serverAddr = ip;
- this.sendData = str;
- this.dataLen = len;
- this.port = port;
- }
-
- public static void main(String[] args) {
-
-
- byte[] bys = new byte[256];
- for(int i = 0; i < 256; i++){
- bys[i] = (byte) i;
- }
- for(int i = 0; i < bys.length; i++){
- System.out.println(i + "--->" + bys[i]);
- }
- while(true){
- try {
- new Thread(new NioUdpClient(InetAddress.getLocalHost(), 1000, bys,256)).start();
- } catch (UnknownHostException e) {
-
- e.printStackTrace();
- }
- Thread.currentThread();
- try {
- Thread.sleep(200);
- } catch (InterruptedException e) {
-
- e.printStackTrace();
- }
- }
- }
-
-
- public void run() {
-
- try {
-
- System.out.println("Client: Start connecting\n");
- DatagramSocket socket = new DatagramSocket();
-
- DatagramPacket packet = new DatagramPacket(sendData, dataLen, serverAddr, port);
- System.out.println("Client: Sending "+dataLen+"bytes'" + new String(sendData) + "'\n");
- socket.send(packet);
- System.out.println("Client: Message sent\n");
- System.out.println("Client: Succeed!\n");
- } catch (Exception e) {
- System.out.println("Client: Error!\n");
- }
- }
- }
0 0