- 浏览: 258063 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jeans_1312:
...
JAVA检测字符串编码并转换 -
zenzuguo:
为啥我在eclipse tomcat6.0启动时总报错
Ma ...
appfuse2.0.2在eclipse下的开发和使用 -
josewu2009:
楼主我用你的方法在window机器 上 压缩后 ,解压文件时报 ...
java压缩文件夹下的所有文件和选定文件及乱码解决 -
TonyLian:
我觉得2楼提出的,只不过是看起来更漂亮而已,原写法也不会出现B ...
Ibatis动态查询例子(#和$以及iterate等的用法) -
zhaoshg:
谢谢 lemonweirui 的更正,帮我发现了一个bug,谢 ...
Ibatis动态查询例子(#和$以及iterate等的用法)
前言:
jdk供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,但在使用上略显得复杂一些。在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个CPU的处理能力和处理中的等待时间,达到提高服务能力的目的。
这段时间在研究NIO,写篇博客来记住学过的东西。还是从最简单的Hello World开始,
client多线程请求server端,server接收client的名字,并返回Hello! +名字的字符格式给client。当然实际应用并不这么简单,实际可能是访问文件或者数据库获取信息返回给client。非阻塞的NIO有何神秘之处?代码:
1)server端代码
/** * * @author Jeff * */ public class HelloWorldServer { static int BLOCK = 1024; static String name = ""; protected Selector selector; protected ByteBuffer clientBuffer = ByteBuffer.allocate(BLOCK); protected CharsetDecoder decoder; static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder(); public HelloWorldServer(int port) throws IOException { selector = this.getSelector(port); Charset charset = Charset.forName("GB2312"); decoder = charset.newDecoder(); } // 获取Selector protected Selector getSelector(int port) throws IOException { ServerSocketChannel server = ServerSocketChannel.open(); Selector sel = Selector.open(); server.socket().bind(new InetSocketAddress(port)); server.configureBlocking(false); server.register(sel, SelectionKey.OP_ACCEPT); return sel; } // 监听端口 public void listen() { try { for (;;) { selector.select(); Iterator iter = selector.selectedKeys().iterator(); while (iter.hasNext()) { SelectionKey key = (SelectionKey) iter.next(); iter.remove(); process(key); } } } catch (IOException e) { e.printStackTrace(); } } // 处理事件 protected void process(SelectionKey key) throws IOException { if (key.isAcceptable()) { // 接收请求 ServerSocketChannel server = (ServerSocketChannel) key.channel(); SocketChannel channel = server.accept(); //设置非阻塞模式 channel.configureBlocking(false); channel.register(selector, SelectionKey.OP_READ); } else if (key.isReadable()) { // 读信息 SocketChannel channel = (SocketChannel) key.channel(); int count = channel.read(clientBuffer); if (count > 0) { clientBuffer.flip(); CharBuffer charBuffer = decoder.decode(clientBuffer); name = charBuffer.toString(); // System.out.println(name); SelectionKey sKey = channel.register(selector, SelectionKey.OP_WRITE); sKey.attach(name); } else { channel.close(); } clientBuffer.clear(); } else if (key.isWritable()) { // 写事件 SocketChannel channel = (SocketChannel) key.channel(); String name = (String) key.attachment(); ByteBuffer block = encoder.encode(CharBuffer .wrap("Hello !" + name)); channel.write(block); //channel.close(); } } public static void main(String[] args) { int port = 8888; try { HelloWorldServer server = new HelloWorldServer(port); System.out.println("listening on " + port); server.listen(); } catch (IOException e) { e.printStackTrace(); } } }server主要是读取client发过来的信息,并返回一条信息
2)client端代码
/** * * @author Jeff * */ public class HelloWorldClient { static int SIZE = 10; static InetSocketAddress ip = new InetSocketAddress("localhost", 8888); static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder(); static class Message implements Runnable { protected String name; String msg = ""; public Message(String index) { this.name = index; } public void run() { try { long start = System.currentTimeMillis(); //打开Socket通道 SocketChannel client = SocketChannel.open(); //设置为非阻塞模式 client.configureBlocking(false); //打开选择器 Selector selector = Selector.open(); //注册连接服务端socket动作 client.register(selector, SelectionKey.OP_CONNECT); //连接 client.connect(ip); //分配内存 ByteBuffer buffer = ByteBuffer.allocate(8 * 1024); int total = 0; _FOR: for (;;) { selector.select(); Iterator iter = selector.selectedKeys().iterator(); while (iter.hasNext()) { SelectionKey key = (SelectionKey) iter.next(); iter.remove(); if (key.isConnectable()) { SocketChannel channel = (SocketChannel) key .channel(); if (channel.isConnectionPending()) channel.finishConnect(); channel .write(encoder .encode(CharBuffer.wrap(name))); channel.register(selector, SelectionKey.OP_READ); } else if (key.isReadable()) { SocketChannel channel = (SocketChannel) key .channel(); int count = channel.read(buffer); if (count > 0) { total += count; buffer.flip(); while (buffer.remaining() > 0) { byte b = buffer.get(); msg += (char) b; } buffer.clear(); } else { client.close(); break _FOR; } } } } double last = (System.currentTimeMillis() - start) * 1.0 / 1000; System.out.println(msg + "used time :" + last + "s."); msg = ""; } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { String names[] = new String[SIZE]; for (int index = 0; index < SIZE; index++) { names[index] = "jeff[" + index + "]"; new Thread(new Message(names[index])).start(); } } }
发表评论
-
JProfiler 7.X注册码
2013-05-09 11:23 2355L-Larry_Lau@163.com#24777-1i8 ... -
JVM介绍
2012-03-23 09:52 1056JVM 一、什么是Java虚拟机 当你谈到Jav ... -
Velocity语法
2012-03-22 18:20 1232一、基本语法 1、& ... -
Java排列组合算法
2012-03-11 23:07 3870import java.util.ArrayList; ... -
UrlRewrite使用小结(转)
2011-09-01 10:37 1372urlrewrite顾名思义,就是 ... -
JAVA检测字符串编码并转换
2011-08-03 14:15 5970就一个类,detectUtf8(String w3UrlPar ... -
JAVA NIO 简介
2011-03-09 13:20 946http://www.iteye.com/topic/8344 ... -
一台机器运行多个JBoss多实例
2011-02-28 10:12 7646我们经常会遇到这种情况,有时候希望在同一台机器上部署若干个JB ... -
如何使 maven+jetty运行时不锁定文件
2011-02-23 13:07 2682原因是Jetty会使用内存映射文件来缓存静态文件,其中包括js ... -
java压缩文件夹下的所有文件和选定文件及乱码解决
2010-12-27 15:04 2317在linux下,如果文件夹内的文件是中文名,那么压缩后,这些文 ... -
Json-lib在Json转Java时日期为空处理出错的解决办法
2010-12-07 20:03 12150我在处理json和java的相互转换中出现这样 ... -
二进制、八进制、十进制、十六进制
2010-11-06 12:57 1860一、 十进制与二进 ... -
WebService开发经验(转载)
2010-11-05 08:52 1968去年,在一个大型项目(1500w)中用到Web Servi ... -
根据sessionId获取Session对象
2010-10-22 15:51 7656Servlet2.1之后不支持SessionContext里面 ... -
Dom4J工具类
2010-09-17 16:34 2267import java.io.File; import ja ... -
Spring事务配置的五种方式
2010-09-02 17:20 878Spring配置文件中关于事务配置总是由三个组成部分, ... -
java webservice的发布以及调用
2010-08-25 13:13 6047安装axis 下载:http://ws.apache.org/ ... -
利用Spring的AOP来配置和管理你的二级缓存(EHCache)
2010-08-03 16:23 990如果我们的项目中采用的是Spring+hibernate来构 ... -
Java操作XML文件 dom4j 篇
2010-07-30 16:44 1065在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它 ... -
dom4j建立,修改XML文档,并解决格式化输出和中文
2010-07-30 16:40 1214package com.holen.dom4j; imp ...
相关推荐
在Java NIO中,Socket通信可以采用非阻塞模式,允许一个线程处理多个客户端连接,这对于高并发的网络应用尤其有益。 在给定的示例中,`HelloWorldServer`类展示了如何使用NIO创建一个非阻塞的服务器。以下是关键...
jdk供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,但在使用上略显得复杂一些。在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务...非阻塞的NIO有何神秘之处?直接上代码!
而更高级的socket编程则会使用`java.nio.channels.SocketChannel`和`java.nio.channels.ServerSocketChannel`类,它们支持非阻塞模式和更高效的数据处理方式。 #### 二、非阻塞IO与选择器 传统的IO操作是阻塞式的...
在深入探讨Netty 5.0的架构和源码之前,我们需要先理解NIO(非阻塞I/O)的概念。NIO与传统的阻塞I/O模型不同,它允许多个操作在单个线程上并发进行,提高了系统资源利用率,尤其适用于高并发、低延迟的网络应用。 ...
- **性能优化**:针对特定场景,可以对Socket编程进行优化,如使用NIO(非阻塞I/O)提高性能。 综上所述,这份实验报告不仅涵盖了Socket编程的基础知识,还提供了具体的Java代码示例,对于学习网络编程具有一定的...
Java的NIO(New IO)提供了一种非阻塞的I/O模型,可以提高多并发连接的效率。此外,TCP的Keep-Alive和 Nagle算法也可以根据实际情况调整,以优化网络性能。 总结,Java Socket结合SSL/TLS等安全技术,可以构建安全...
NIO(New IO)提供了一种更高效、非阻塞的I/O模型。 8. **网络编程**:Java提供了Socket编程接口,可以用来创建客户端和服务器端的通信应用。 9. **反射机制**:反射是Java的一个强大特性,允许程序在运行时动态地...
8. **IO与NIO**: Java IO提供基于流的输入输出操作,而NIO(非阻塞I/O)引入了通道和缓冲区,提升了高并发场景下的性能。 9. **集合框架**: 遍历HashMap、ArrayList、LinkedList、TreeSet等集合的实现原理,掌握...
4. 非阻塞Socket:Java NIO中的SocketChannel和ServerSocketChannel是非阻塞网络套接字,它们允许你在没有数据可读或可写时,不会挂起当前线程。 5. MBean和JMX工具:文章提到了使用MBean和Java管理扩展(JMX)工具...
2. **网络编程**:16章可能讲解了Java的Socket编程,包括TCP和UDP通信,以及ServerSocket和Socket类的使用,还有可能涉及到NIO(非阻塞I/O)和Netty框架的应用。 3. **数据持久化**:17章可能是关于数据库操作的...
5. **IO流与NIO**:讲解输入/输出流的使用,包括字节流、字符流、对象流,以及NIO(非阻塞I/O)的优势和用法,如通道、缓冲区和选择器。 6. **多线程编程**:涵盖线程的创建方式(继承Thread类与实现Runnable接口)...
- **非阻塞Socket**:介绍如何使用NIO来实现非阻塞式的Socket编程,提高程序效率。 - **多线程Socket编程**:讨论了如何在Java中利用多线程技术处理多个客户端的并发连接请求。 ##### 4. 高级主题 - **错误处理**...
3. **NIO(非阻塞I/O)**:Java NIO(New Input/Output)是Java 1.4引入的新特性,它提供了与传统IO不同的I/O操作方式,支持选择器(Selector)、通道(Channel)和缓冲区(Buffer)。NIO允许程序在数据准备好时进行...
4. **IO流与NIO**:这部分习题会测试你对输入输出流的理解,包括文件操作、对象序列化,以及新的NIO(非阻塞I/O)模型。 5. **多线程**:Java提供了丰富的多线程支持,习题可能包括同步机制(如synchronized关键字...
此外,NIO(非阻塞I/O)和AIO(异步I/O)也是现代服务端开发的热点,可能会涉及到。 **第五章:JVM优化** 理解Java虚拟机(JVM)的工作原理对性能调优至关重要。本章可能包含JVM内存模型、垃圾回收机制、类加载机制...
1. **Netty 框架**:Netty 是一个基于 NIO(非阻塞 I/O)的 Java 框架,提供了高度定制的事件循环(EventLoop)、通道(Channel)和管道(ChannelPipeline)机制,使得编写高性能、异步的网络应用变得简单。...
1. NIO基础:Netty基于Java NIO来实现非阻塞的网络通信,因此需要对Java NIO有一定的了解。 2. 事件处理:Netty采用事件驱动机制来处理各种网络事件,理解其事件处理模型是掌握Netty的关键。 3. ChannelPipeline:...
6. **IO流与NIO**:详细解读了Java的输入输出流体系,包括字节流、字符流、对象序列化,以及Java NIO(非阻塞I/O)的使用,帮助读者理解和处理数据的读写操作。 7. **多线程编程**:介绍了线程的创建方式,如实现...