- 浏览: 200846 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ouyangshixiong:
...
秒杀Eclipse查看Jar包源码乱码问题 -
cs6641468:
WatchKey都没有reset,第二次loop妥妥的捕获不到 ...
Java7 使用WatchService监听文件变化 -
ck_2036:
...
秒杀Eclipse查看Jar包源码乱码问题 -
asialee:
复杂对象就需要使用framedecorator了
Netty对象传输
一个可运行的简单NIO实例,首先是一个抽象的服务端类AbstractNIOServer
public abstract class AbstractNIOServer implements Runnable { // 要监听的端口号 protected int port; // 生成一个信号监视器 protected Selector s; public AbstractNIOServer(int port) { this.port = port; try { s = Selector.open(); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { // 生成一个ServerScoket通道的实例对象,用于侦听可能发生的IO事件 ServerSocketChannel ssc = ServerSocketChannel.open(); // 将该通道设置为异步方式 ssc.configureBlocking(false); // 绑定到一个指定的端口 ssc.socket().bind(new InetSocketAddress(port)); // 注册特定类型的事件到信号监视器上 ssc.register(s, SelectionKey.OP_ACCEPT); System.out.println("The server has been launched..."); while (true) { // 将会阻塞执行,直到有事件发生 s.select(); Iterator<SelectionKey> it = s.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey key = it.next(); // key定义了四种不同形式的操作 switch (key.readyOps()) { case SelectionKey.OP_ACCEPT: dealwithAccept(key); break; case SelectionKey.OP_CONNECT: break; case SelectionKey.OP_READ: dealwithRead(key); break; case SelectionKey.OP_WRITE: break; } // 处理结束后移除当前事件,以免重复处理 it.remove(); } } } catch (IOException e) { e.printStackTrace(); } } // 处理接收连接的事件 public abstract void dealwithAccept(SelectionKey key); // 处理客户端发来的消息,处理读事件 public abstract void dealwithRead(SelectionKey key); }
服务端实现类SynServer
class SynServer extends AbstractNIOServer { public SynServer(int port) { super(port); } // 读缓冲区 private ByteBuffer r_bBuf = ByteBuffer.allocate(1024); private ByteBuffer w_bBuf; // 处理接收连接的事件 @Override public void dealwithAccept(SelectionKey key) { try { System.out.println("新的客户端请求连接..."); ServerSocketChannel server = (ServerSocketChannel) key.channel(); SocketChannel sc = server.accept(); sc.configureBlocking(false); // 注册读事件 sc.register(s, SelectionKey.OP_READ); System.out.println("客户端连接成功..."); // 更新最新域模型 } catch (IOException e) { e.printStackTrace(); } } // 处理客户端发来的消息,处理读事件 @Override public void dealwithRead(SelectionKey key) { try { SocketChannel sc = (SocketChannel) key.channel(); System.out.println("读入数据"); r_bBuf.clear(); // 将字节序列从此通道中读入给定的缓冲区r_bBuf sc.read(r_bBuf); r_bBuf.flip(); String msg = Charset.forName("UTF-8").decode(r_bBuf).toString(); if (msg.equalsIgnoreCase("time")) { w_bBuf = ByteBuffer.wrap(getCurrentTime().getBytes("UTF-8")); sc.write(w_bBuf); w_bBuf.clear(); } else if (msg.equalsIgnoreCase("bye")) { sc.write(ByteBuffer.wrap("已经与服务器断开连接".getBytes("UTF-8"))); sc.socket().close(); } else { sc.write(ByteBuffer.wrap(msg.getBytes("UTF-8"))); } System.out.println(msg); System.out.println("处理完毕..."); r_bBuf.clear(); try { Thread.currentThread(); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } private String getCurrentTime() { Calendar date = Calendar.getInstance(); String time = "服务器当前时间:" + date.get(Calendar.YEAR) + "-" + date.get(Calendar.MONTH) + 1 + "-" + date.get(Calendar.DATE) + " " + date.get(Calendar.HOUR) + ":" + date.get(Calendar.MINUTE) + ":" + date.get(Calendar.SECOND); return time; } }
服务端测试类TestServer
public class TestServer { public static void main(String[] args) { Executors.newSingleThreadExecutor().submit(new SynServer(1982)); // new Thread().start(); } }
客户端测试类TestClient
public class TestClient { public static void main(String[] args) { new MiniClient("localhost", 1982); } } class MiniClient { private SocketChannel sc; private ByteBuffer w_bBuf; private ByteBuffer r_bBuf = ByteBuffer.allocate(1024); public MiniClient(String host, int port) { try { InetSocketAddress remote = new InetSocketAddress(host, port); sc = SocketChannel.open(); sc.connect(remote); if (sc.finishConnect()) { System.out.println("已经与服务器成功建立连接..."); } while (true) { if (!sc.socket().isConnected()) { System.out.println("已经与服务器失去了连接..."); return; } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println("读入一行数据,开始发送..."); w_bBuf = ByteBuffer.wrap(str.getBytes("UTF-8")); // 将缓冲区中数据写入通道 sc.write(w_bBuf); System.out.println("数据发送成功..."); w_bBuf.clear(); System.out.println("接收服务器端响应消息..."); try { Thread.currentThread(); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } r_bBuf.clear(); // 将字节序列从此通道中读入给定的缓冲区r_bBuf sc.read(r_bBuf); r_bBuf.flip(); String msg = Charset.forName("UTF-8").decode(r_bBuf).toString(); System.out.println(msg); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
发表评论
-
Netty对象传输
2013-03-06 15:45 3140转自:http://www.xiaoyaochong.ne ... -
Java ArrayBlockingQueue源码解析
2013-03-01 17:43 4825转自:http://www.xiaoyaoch ... -
Eclipse常用快捷键
2013-03-01 15:10 967Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ct ... -
Java7 TransferQueue入门实例
2013-03-01 10:10 2674转自:http://www.xiaoyaochong.ne ... -
Java7 使用WatchService监听文件变化
2013-02-26 13:56 8969Watch service 用来观察被注册了的对象的变化和 ... -
Java7 AutoCloseable入门实例
2013-02-26 10:03 5024本文转自:http://www.xiaoyaochong. ... -
Java7 ForkJoin入门实例
2013-02-19 10:37 10029本文转自:http://www.xiaoyaochong. ... -
Java原子变量与ABA问题(转发)
2013-01-07 23:12 4387原文地址:http://www.xiaoyaochong.ne ... -
Java简单迭代器例子
2013-01-04 14:18 3864一直好奇Foreach的语法,想ArrayList和HashM ... -
Java NIO选择器Selector
2012-12-27 13:07 1611Selector消息选择器一般作为SelectableChan ... -
Java Channel解析与实例
2012-12-24 16:09 1318文件IO FileChannel是处理 ... -
Java Comparable接口分析与实践
2012-12-20 14:22 1342此接口对实现它的每个类的对象进行整体排序。这种排序被称为类的自 ... -
PHP远程调用Java服务
2012-12-18 14:16 2389一种比较常见的语言搭配:PHP + Java。 整体架构时这 ... -
Java AIO 入门实例
2012-12-13 16:15 11604原文出处:http://tigerlchen.iteye.co ... -
Java BIO NIO 机制原理资料整理
2012-12-12 14:33 1331转自:http://www.xiaoyaocho ... -
JavaSE Buffer与Netty Buffer比较
2012-12-04 16:15 1393Buffer数据结构: 3 ... -
SWT/JFace的工具类
2012-11-26 14:35 1321自己写的一个SWT/JFace的工具类,有了它,构建Label ... -
Java 读取Zip文件中的某个子文件
2012-11-26 14:26 6788在test.zip文件中读取test.xml文件内容。 ... -
Java容器
2012-10-28 21:13 1287Set 一个不包含重复 ... -
Java Socket
2012-08-17 09:28 1083比较经典的用法,使用ServerSocket构建服务端,用a ...
相关推荐
在这个javaNIO实例中,我们可以学习到如何利用Java NIO进行文件的读取、写入以及复制操作。 首先,NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据传输的路径,如文件通道...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java程序员提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)相比,主要的...
"Java NIO实例UDP发送接收数据代码分享" Java NIO(Non-blocking I/O)是一种异步I/O模型,允许开发者在单个线程中处理多个I/O操作,从而提高程序的性能和可扩展性。在Java NIO中,DatagramChannel是专门用于发送...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
在这个实例中,"java NIO 消息推送实例" 旨在展示如何使用NIO进行服务器向客户端的消息推送。 1. **Java NIO基础** - **通道(Channels)**:Java NIO 提供了多种通道,如文件通道、套接字通道等,它们代表不同...
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
在标题中提到的“java-nio.rar_java nio_nio 对象实例化”,我们可以理解为这个压缩包中包含了关于Java NIO对象实例化的具体示例或教程。下面我们将详细讨论NIO中的核心对象及其实例化方法。 1. **通道(Channel)*...
本资料"JavaNIO服务器实例Java开发Java经验技巧共6页"可能是某个Java开发者或讲师分享的一份关于如何在Java中构建NIO服务器的教程,涵盖了6个关键页面的内容。尽管具体的细节无法在此直接提供,但我们可以根据Java ...
Java NIO(New IO)是Java 1.4版本引入的一个新API,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO...在实际编码时,参考博文链接中的代码实例,可以帮助你更好地理解和实践Java NIO。
Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于标准Java IO API的处理I/O操作的方式。NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,...对于理解和实践Java NIO在网络编程中的应用,这是一个非常有价值的参考实例。
总之,这个Java NIO IM实例是一个很好的学习资源,它演示了如何利用NIO进行高效的网络通信。通过深入理解并实践这个示例,开发者可以更好地掌握Java NIO的核心概念和技术,并将其应用于实际项目中,提升系统的性能和...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...
**JAVA-NIO程序设计完整实例** Java NIO(New IO)是Java 1.4引入的一个新特性,它为Java提供了非阻塞I/O操作的能力,使得Java在处理I/O时更加高效。NIO与传统的BIO(Blocking I/O)模型相比,其核心在于它允许程序...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO...对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。
Java NIO(New IO)是Java 1.4引入的一个新特性,它是对传统IO模型的重大改进,提供了更高效的数据处理方式。NIO的核心概念包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。它允许多个输入/输出操作...
### Java NIO原理 图文分析及代码实现 #### 前言 在深入探讨Java NIO之前,我们先简要回顾一下NIO的概念及其引入的原因。随着互联网的发展,越来越多的应用程序需要处理高并发的网络连接请求。传统的阻塞I/O模型在...
四、NIO应用实例 1. **文件操作**:使用FileChannel进行文件的读写,例如将一个文件复制到另一个文件。 2. **网络通信**:使用SocketChannel和ServerSocketChannel进行客户端和服务器端的连接与数据传输。 3. **多...