- 浏览: 253233 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 2296L-Larry_Lau@163.com#24777-1i8 ... -
JVM介绍
2012-03-23 09:52 1020JVM 一、什么是Java虚拟机 当你谈到Jav ... -
Velocity语法
2012-03-22 18:20 1198一、基本语法 1、& ... -
Java排列组合算法
2012-03-11 23:07 3838import java.util.ArrayList; ... -
UrlRewrite使用小结(转)
2011-09-01 10:37 1336urlrewrite顾名思义,就是 ... -
JAVA检测字符串编码并转换
2011-08-03 14:15 5892就一个类,detectUtf8(String w3UrlPar ... -
JAVA NIO 简介
2011-03-09 13:20 911http://www.iteye.com/topic/8344 ... -
一台机器运行多个JBoss多实例
2011-02-28 10:12 7614我们经常会遇到这种情况,有时候希望在同一台机器上部署若干个JB ... -
如何使 maven+jetty运行时不锁定文件
2011-02-23 13:07 2653原因是Jetty会使用内存映射文件来缓存静态文件,其中包括js ... -
java压缩文件夹下的所有文件和选定文件及乱码解决
2010-12-27 15:04 2265在linux下,如果文件夹内的文件是中文名,那么压缩后,这些文 ... -
Json-lib在Json转Java时日期为空处理出错的解决办法
2010-12-07 20:03 12120我在处理json和java的相互转换中出现这样 ... -
二进制、八进制、十进制、十六进制
2010-11-06 12:57 1798一、 十进制与二进 ... -
WebService开发经验(转载)
2010-11-05 08:52 1926去年,在一个大型项目(1500w)中用到Web Servi ... -
根据sessionId获取Session对象
2010-10-22 15:51 7618Servlet2.1之后不支持SessionContext里面 ... -
Dom4J工具类
2010-09-17 16:34 2225import java.io.File; import ja ... -
Spring事务配置的五种方式
2010-09-02 17:20 841Spring配置文件中关于事务配置总是由三个组成部分, ... -
java webservice的发布以及调用
2010-08-25 13:13 6017安装axis 下载:http://ws.apache.org/ ... -
利用Spring的AOP来配置和管理你的二级缓存(EHCache)
2010-08-03 16:23 928如果我们的项目中采用的是Spring+hibernate来构 ... -
Java操作XML文件 dom4j 篇
2010-07-30 16:44 1017在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它 ... -
dom4j建立,修改XML文档,并解决格式化输出和中文
2010-07-30 16:40 1179package com.holen.dom4j; imp ...
相关推荐
java解读NIOSocket非阻塞模式宣贯.pdf
jdk供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,但在使用上略显得复杂一些。在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务...非阻塞的NIO有何神秘之处?直接上代码!
Java编写的简易聊天工具,使用NIO实现非阻塞socket通信,使用Java原生sdk实现,可以运行。
基于JavaNIO的非阻塞通信的研究与实现
可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 2,运行client.bat启动客户端,可以打开编辑,ip,和端口号 3...
本人写的Nio非阻塞socket通信demo,内有注释。
java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket
java NIO 高性能 socket通讯,服务端采用单线程,降低了cpu的压力,普通io socket通讯,server需要每个连接运行个线程,容易出现问题,效率也低
NULL 博文链接:https://b-l-east.iteye.com/blog/1254693
本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成
NioSocket,包括server端和client端。server端有自动判定client掉线机制,client端有自动重连机制。本人已在项目实用,未经允许禁止转载!
Java NIO非阻塞服务端与客户端相互通信 每行代码都有注释, 看完后,会让你对非阻塞有一清楚的认识.
用nio想的一个不阻塞NIOSocket例子.。。希望对阁下有用
socket通信nio模式有很多实现方式,但是在性能上、资源上一般很少考虑,这里封装了一个性能极强的程序。
基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例基于NIO的socket举例 基于NIO的socket举例
一个简单的javaNIO非阻塞的聊天小demo,支持单聊和群聊
java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。 ● SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信。 ● Selector:为...
NULL 博文链接:https://ginge.iteye.com/blog/363178
支持高并发,可以通过socket传输文件。 服务机实现了的功能:1、不间断的接收客户端的消息。2、当有指令过来的时候跟客户机建立连接操作完成后断开连接; 客户机实现了的功能:1、不间断的发送本机运行情况。2、监听...
nio的socket小玩意儿, 对于初学者有点用处,大家可以相互学习下嘛