package com.test.socket; import java.net.DatagramSocket; import java.net.InetSocketAddress; 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.util.Iterator; public class DatagramChannelTestMain { private static final int port = 30008; private static final int TIMEOUT = 3000; /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Thread serverThread = new ServerThread(); serverThread.start(); Thread clientThread = new ClientThread(); clientThread.start(); Thread.sleep(2000); } static class ServerThread extends Thread { @Override public void run() { DatagramChannel channel = null; try { channel = DatagramChannel.open(); channel.configureBlocking(false); DatagramSocket socket = channel.socket(); socket.bind(new InetSocketAddress(port)); Selector selector = Selector.open(); channel.register(selector, SelectionKey.OP_READ); while(selector.isOpen()){ System.out.println("S....!!!"); if(selector.select() == 0){//select must be System.out.println("s...."); Thread.sleep(2000); continue; } Iterator<SelectionKey> it = selector.selectedKeys().iterator(); while(it.hasNext()){ SelectionKey key = it.next(); if(key.isValid() && key.isReadable()){ read(key); } } } }catch(Exception e){ e.printStackTrace(); }finally{ if(channel != null){ try{ channel.close(); }catch (Exception ex) { ex.printStackTrace(); } } } } private void read(SelectionKey key) throws Exception { DatagramChannel channel = (DatagramChannel)key.channel(); System.out.println("channel" + channel.toString()); ByteBuffer byteBuffer = ByteBuffer.allocate(256); InetSocketAddress address = (InetSocketAddress)channel.receive(byteBuffer); if(address == null){ System.out.println("....."); }else{ System.out.println(address.getAddress() + "//" + address.getPort()); } byteBuffer.flip(); Charset charset = Charset.defaultCharset(); CharBuffer charBuffer = charset.decode(byteBuffer); System.out.println("Server read:" + charBuffer.toString()); //if write,please here. byteBuffer = charset.encode("this is server sent!"); channel.send(byteBuffer, address); key.interestOps(SelectionKey.OP_READ); } } static class ClientThread extends Thread { @Override public void run() { DatagramChannel channel = null; try { channel = DatagramChannel.open(); channel.configureBlocking(false); channel.connect(new InetSocketAddress("10.12.124.19",port)); while(!channel.isConnected()){ System.out.println("...."); } Selector selector = Selector.open(); channel.register(selector, SelectionKey.OP_WRITE); while(selector.isOpen()){ if(selector.select() == 0){ Thread.sleep(2000); continue; } Iterator<SelectionKey> it = selector.selectedKeys().iterator(); while(it.hasNext()){ SelectionKey key = it.next(); if(key.isValid() && key.isWritable()){ write(key); }else if(key.isReadable()){ read(key); } } } }catch (Exception e) { e.printStackTrace(); }finally{ if(channel != null){ try{ channel.close(); }catch(Exception ex){ ex.printStackTrace(); } } } } private void write(SelectionKey key) throws Exception{ DatagramChannel channel = (DatagramChannel)key.channel(); Charset charset = Charset.defaultCharset(); ByteBuffer byteBuffer = charset.encode("this is client sent!"); System.out.println("p:" + byteBuffer.position() + "//l:" + byteBuffer.limit()); while(byteBuffer.hasRemaining()){ channel.write(byteBuffer); } System.out.println("cw ok!"); key.interestOps(SelectionKey.OP_READ); } private void read(SelectionKey key) throws Exception{ DatagramChannel channel = (DatagramChannel)key.channel(); Charset charset = Charset.defaultCharset(); // ByteBuffer byteBuffer = charset.encode("this is client sent!"); // System.out.println("p:" + byteBuffer.position() + "//l:" + byteBuffer.limit()); ByteBuffer byteBuffer = ByteBuffer.allocate(256); while(channel.read(byteBuffer) > 0){ // } byteBuffer.flip(); CharBuffer charBuffer = charset.decode(byteBuffer); System.out.println("Client read:" + charBuffer.toString()); key.interestOps(SelectionKey.OP_WRITE); } } }
相关推荐
Java NIO(New IO)是Java 1.4版本引入的一个新API,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO...在实际编码时,参考博文链接中的代码实例,可以帮助你更好地理解和实践Java NIO。
"Java NIO实例UDP发送接收数据代码分享" Java NIO(Non-blocking I/O)是一种异步I/O模型,允许开发者在单个线程中处理多个I/O操作,从而提高程序的性能和可扩展性。在Java NIO中,DatagramChannel是专门用于发送...
在尚硅谷的12讲课程中,这些知识点将通过实例演示和详细解释,让学习者掌握Java NIO的精髓,并能够实际应用到项目开发中,提升系统的性能和并发处理能力。通过系统学习,开发者将更好地理解Java NIO的优势,并能在...
1. **打开和关闭通道**:你可以通过`DatagramChannel.open()`方法创建一个新的`DatagramChannel`实例,用于处理UDP通信。当不再需要该通道时,可以调用`close()`方法关闭它,释放相关资源。 2. **绑定地址**:使用`...
7. Java NIO应用实例: - 在聊天服务器案例中,使用选择器能够实现用一个线程监听和处理多个通道中的数据传输,使得程序结构更为简洁。 - 通过注册通道到选择器并监听事件,可以实现高效的网络应用,比如聊天...
#### 三、Java NIO 使用实例 下面是一个简单的 Java NIO 示例,展示了如何使用 `FileChannel` 和 `ByteBuffer` 进行文件复制: ```java package nio; import java.io.FileInputStream; import java.io....
它提供了四个静态工厂方法来创建不同的ByteBuffer实例: - `allocate(int capacity)`:创建一个常规的Heap ByteBuffer。 - `allocateDirect(int capacity)`:创建一个Direct ByteBuffer,它通常在内存映射文件或直接...
`nio-src.rar`文件中可能包含了一些NIO的示例代码,包括如何创建和操作通道、缓冲区以及选择器的实例,通过阅读和运行这些代码,可以帮助开发者深入理解NIO的工作原理和使用方法。 **8. 学习路径** 学习NIO,首先应...
9. **实际应用示例**:书籍中会包含大量实例,展示如何在实际项目中应用NIO,例如构建高性能的Web服务器、文件复制服务等。 10. **NIO与BIO的比较**:对比两种I/O模型的优缺点,帮助读者理解何时选择NIO,何时使用...
* DatagramChannel:UDP 协议网络通信 * SocketChannel:TCP 协议网络通信 * ServerSocketChannel:监听 TCP 连接 Buffer Buffer 是 NIO 中所使用的缓冲区,它不是一个简单的 byte 数组,而是封装过的 Buffer 类。...
Java NIO(非阻塞I/O)中的Selector是一个核心组件,它允许单个线程处理多个通道(channels)上的I/O事件。Selector的角色就像一个交通指挥员,能够监控多个通道并...理解并熟练使用Selector是掌握Java NIO的关键部分。
通过`NioDatagramChannel`,我们可以监听和发送UDP数据包。 2. **配置Bootstrap**: 使用`Bootstrap`类来配置我们的客户端或服务器端。设置事件循环组、处理器管道以及连接配置。 3. **添加Handler**: 在处理器管道...
在 Netty 中,我们可以使用 `NioDatagramChannel` 类来处理 UDP 通信。 创建 UDP 接收服务的关键步骤如下: 1. **初始化 Bootstrap**:首先,我们需要创建一个 `Bootstrap` 实例,这是 Netty 中启动服务器的基本...
`java.hearing3oc`可能是指一个特定的教程系列或者代码示例集合,用于教授Java NIO的相关知识,`扣弄你澳大`这部分可能是误输入或者某种特定的表述,不直接影响知识点的解释。 通道接口包括以下常见的实现类: - *...
根据不同的协议和I/O模型,Netty提供了多种Channel实现,如NioServerSocketChannel用于服务器端TCP连接,NioDatagramChannel用于UDP连接等。 3. **Handler配置**: 在ChannelPipeline中添加各种处理器(Handler),...
在NIO UDP客户端的实现中,通常需要创建一个`DatagramChannel`,并注册到`Selector`上,设置为监听`OP_READ`事件。当`Selector`选择键变为可读时,客户端可以发送数据到服务器,然后读取服务器的响应。客户端的代码...
例如,SocketChannel、FileChannel和DatagramChannel是常见的通道类型。通过注册通道到选择器,我们可以监控多个通道的状态。 3. **选择器(Selector)**: 选择器是NIO中的关键组件,它允许单个线程检查多个通道...