服务端代码
package com.aisuo.cn.run; import java.io.IOException; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Queue; import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; public class AutoRunServer3 implements Runnable { private static final int port = 59000; private Charset cs = Charset.forName("utf-8"); private static ByteBuffer sBuffer = ByteBuffer.allocate(514); private static ByteBuffer rBuffer = ByteBuffer.allocate(514); private Queue<Map<DatagramChannel, SocketAddress>> clientsQueue = new LinkedBlockingQueue<Map<DatagramChannel, SocketAddress>>(); private static Selector selector; private static Queue<String> queue = new LinkedBlockingQueue<String>(); public AutoRunServer3() { try { init(); } catch (Exception e) { e.printStackTrace(); } } private void init() throws IOException { DatagramChannel serverSocketChannel = DatagramChannel.open(); serverSocketChannel.configureBlocking(false); DatagramSocket serverSocket = serverSocketChannel.socket(); serverSocket.bind(new InetSocketAddress(port)); selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_READ); System.out.println("server start on port:" + port + ";" + new Date()); } private void handle(SelectionKey selectionKey) throws IOException { DatagramChannel client = null; String receiveText = null; //int count = 0; if (selectionKey.isReadable()) { client = (DatagramChannel) selectionKey.channel(); rBuffer.clear(); //count = client.read(rBuffer); //if (count > 0) { SocketAddress sa = client.receive(rBuffer); System.out.println(sa); rBuffer.flip(); System.out.println(rBuffer.get(0)); System.out.println(rBuffer.toString()); byte[] ba = rBuffer.array(); System.out.println(client.toString() + ":" + CRC16M.getBufHexStr(ba)); //dispatch(client, receiveText); setClient(client, receiveText, sa); //client = (DatagramChannel) selectionKey.channel(); //client.register(selector, SelectionKey.OP_READ); //} } } private void setClient(DatagramChannel client, String info, SocketAddress sa) { String name = "[" + sa + ":" + Integer.toHexString(client.hashCode()) + "]"; System.out.println("插入:" + name); Map<DatagramChannel, SocketAddress> map = new HashMap<DatagramChannel, SocketAddress>(); map.put(client, sa); clientsQueue.offer(map); } private void dispatch(String sendMsg) throws IOException, InterruptedException { System.out.println("sendMsg:" + sendMsg); Map<DatagramChannel, SocketAddress> temp = clientsQueue.poll(); for (Map.Entry<DatagramChannel, SocketAddress> cc : temp.entrySet()) { DatagramChannel dc = cc.getKey(); SocketAddress sa = cc.getValue(); sBuffer.clear(); sBuffer.put(sendMsg.getBytes()); sBuffer.flip(); //输出到通道 if (null != sa) dc.send(ByteBuffer.wrap(sendMsg.getBytes()), sa); } } private void putCmd() { /*Scanner sc = new Scanner(System.in); String next = sc.next(); System.out.println("输入:" + next);*/ for (int i = 0; i < 10; i++) { queue.offer("test" + i); } System.out.println("queue:" + queue.size()); } public static void putCmd(String cmd) { queue.offer(cmd); } public static void main(String[] args) { AutoRunServer3 ars = new AutoRunServer3(); //ars.putCmd(); new Thread(ars).start(); } @Override public void run() { // TODO Auto-generated method stub while (true) { try { selector.select();//返回值为本次触发的事件数 Set<SelectionKey> selectionKeys = selector.selectedKeys(); for (SelectionKey key : selectionKeys) { handle(key); } selectionKeys.clear();//清除处理过的事件 if (queue.size() > 0) { String sendMsg = queue.poll(); if (null != sendMsg) { //队列中存在需要发送的报文 dispatch(sendMsg); } System.out.println("Last_queue:" + queue.size()); } } catch (Exception e) { e.printStackTrace(); break; } } } }
客户端代码:
package com.aisuo.cn.run; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.charset.Charset; import java.util.Iterator; import java.util.Set; public class ClientTest implements Runnable { @Override public void run() { DatagramChannel channel = null; Selector selector = null; SocketAddress sa = null; int udpPort = 59000; try { channel = DatagramChannel.open(); channel.configureBlocking(false); sa = new InetSocketAddress("192.168.1.103", udpPort); selector = Selector.open(); channel.register(selector, SelectionKey.OP_READ); ByteBuffer input = ByteBuffer.allocate(64); input.clear(); input.put((byte)0xaa); input.put((byte)0x55); input.put((byte)0x0c); input.put((byte)0x00); input.put((byte)0x37); input.put((byte)0x3f); input.put((byte)0x01); input.put((byte)0x26); input.put((byte)0x01); input.put((byte)0x80); input.put((byte)0x01); input.put((byte)0x00); input.put((byte)0x00); input.put((byte)0x00); input.put((byte)0xfc); input.put((byte)0x87); input.flip(); int count = channel.send(input, sa); System.out.println(count); ByteBuffer byteBuffer = ByteBuffer.allocate(1000); int eventsCount = selector.select(); System.out.println(eventsCount); if (eventsCount > 0) { Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectedKeys.iterator(); while (iterator.hasNext()) { SelectionKey sk = (SelectionKey) iterator.next(); if (sk.isReadable()) { DatagramChannel datagramChannel = (DatagramChannel) sk.channel(); byteBuffer.clear(); SocketAddress isa = datagramChannel.receive(byteBuffer); byteBuffer.flip(); System.out.println(Charset.defaultCharset().decode(byteBuffer).toString()); Thread.sleep(3000);//延时 datagramChannel.send(Charset.defaultCharset().encode("hello server"), isa); } } } } catch (Exception e) { } } public static void main(String[] args) { new Thread(new ClientTest()).start(); } }
已测!!!!!
相关推荐
NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据量的系统。Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 ...
1. **Netty**:是一个高性能、异步事件驱动的网络应用框架,常用于创建服务器和客户端的TCP、UDP通信。 2. **Grizzly**:是Sun Microsystems(现Oracle)开发的一个开源NIO框架,支持HTTP、WebSocket等多种协议。 *...
Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信,DatagramChannel用于UDP通信。通道可以进行读写操作,并且是非阻塞的,这意味着如果数据未准备好,...
Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、套接字和UDP通信。 2. **缓冲区(Buffers)**:缓冲区是存储数据的主要对象,所有的I/O操作都是通过缓冲区进行的...
Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel用于网络通信,DatagramChannel用于UDP通信等。通道可以同时进行读写操作,并且可以与多个缓冲区进行交互。 2. **缓冲区(Buffer)**: ...
### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...
7. **网络编程**:Java NIO引入了SocketChannel和ServerSocketChannel,用于实现高效的TCP/IP和UDP/IP通信。这些通道与传统的Socket和ServerSocket相比,提供了非阻塞的特性。 `Pro Java 7 NIO.2`这本书由Anghel ...
Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、TCP网络连接和UDP网络连接。 在课程中,第4节将详细讲解Java NIO的通道概念,特别是`Channel`接口及其主要实现...
Java 基础知识之网络通信(TCP 通信、UDP 通信、多播以及 NIO) Java 基础知识之网络通信是 Java 语言中不可或缺的一部分,包括 TCP 通信、UDP 通信、多播以及 NIO 等多种形式。下面将对这些知识点进行详细的解释。...
在Java中,还可以使用NIO(Non-blocking I/O)的`java.nio.channels.DatagramChannel`类进行更高级的UDP操作,例如非阻塞模式下的数据收发,以及与其他NIO通道的交互。 总结来说,Java中的UDP网络编程涉及到创建和...
### Java NIO 相关知识点详解 #### Java NIO 概述 Java NIO(New IO)是从 Java 1.4 版本开始引入的一种新的 I/O 处理方式,它提供了一种不同于传统 Java IO 的操作模式。NIO 的核心组件包括 Channel(通道)、...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从...同时,NIO也常用于网络编程,如TCP和UDP通信,以及文件操作。虽然NIO的学习曲线相对较陡,但掌握后,能为复杂IO场景提供强大的解决方案。
DatagramChannel则用于UDP协议的无连接通信。 7. **多路复用(Multiplexing)** - 通过选择器,一个线程可以同时处理多个通道的事件,实现高效的并发处理。 8. **管道(Pipe)** - 管道是两个线程之间单向的数据...
Java NIO提供了多种类型的通道,例如FileChannel用于文件操作,SocketChannel用于TCP网络通信,DatagramChannel用于UDP通信。通道是非阻塞的,这意味着当数据未准备好时,读取或写入操作不会挂起,而是返回一个特定...
### Java NIO 原理与使用详解 #### 一、Java NIO 概述 在深入了解 Java NIO 的工作原理及其使用之前,我们首先来了解一下什么是 Java NIO(New I/O)。Java NIO 是 Java SE 1.4 版本引入的一个全新的 I/O API,...
Mina提供了一套高级API,简化了基于NIO的网络编程,包括TCP和UDP协议的支持,以及过滤器链机制,方便实现复杂的网络逻辑。 6. **NIO的实际应用**:NIO广泛应用于高性能服务器端的开发,如Web服务器、数据库服务器、...
根据提供的文件信息,本文将围绕Java NIO(New Input/Output)的相关知识点进行详细解析,同时探讨相关的视频学习资源。 ### Java NIO简介 Java NIO(New Input/Output),即新输入输出,是Java 1.4版本引入的一个...
在UDP通信中,双向通信意味着客户端和服务器可以互相发送数据,而不仅仅是单向的数据流。 描述中提到的源码来源于《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》这篇文章,这表明源码实例是为了解释和...