- 浏览: 319321 次
- 性别:
- 来自: 青岛
文章分类
- 全部博客 (140)
- 技术笔记 (3)
- Dwr (1)
- 日常使用技巧 (11)
- eclipse使用技巧 (3)
- jxl使用技巧 (3)
- Struts2 (7)
- java 报表 (3)
- Webservices (2)
- Flex (15)
- vc,vc++ (11)
- Spring (6)
- j2me开发 (1)
- Java (27)
- Sql (11)
- Javascript (5)
- extjs (0)
- C# (8)
- jQuery (2)
- PHP (3)
- apache (4)
- sso单点登录 (1)
- linux (6)
- cisco vpn (1)
- android (1)
- MongoDB性能优化 (1)
- nosql (1)
- Java netbeans (1)
- js (1)
最新评论
-
jinyanhui2008:
hzq20100521 写道你好,我的需求这个有点不一样,我的 ...
spring 多数据库支持,动态切换数据库 -
hzq20100521:
你好,我的需求这个有点不一样,我的是系统启动的时候是连接的默认 ...
spring 多数据库支持,动态切换数据库 -
lbxhappy:
那如果tree.first()一开始就是最大的呢?是不是以后e ...
从bbs中看到的问题:从大量数据中取top100,整理的思路 -
programwyh:
jinyanhui2008 写道programwyh 写道我用 ...
使用jasperreports制作报表(导出pdf excel html) -
jinyanhui2008:
programwyh 写道我用java程序写的运用Jasper ...
使用jasperreports制作报表(导出pdf excel html)
http://unbounder.iteye.com/blog/481396
http://unbounder.iteye.com/blog/481668
基于io包的阻塞式socket通信代码简单,在连接数很少的情况下是一个不错的选择。不过实际应用中一个socket服务器采用传统的阻塞式socket方式通信可能会是一场灾难,一路socket同时进行读写操作可能就需要两条线程,如果需要并发一百路socket(这个量其实很小了),可能就是两百条线程,大概几分钟后cpu占用率就是高居不下了。
基于原生nio的socket通信时一种很好的解决方案,基于事件的通知模式使得多并发时不用维持高数量的线程,高并发的socket服务器的java实现成为现实。不过原生nio代码十分复杂,无论编写还是修改都是一件头疼的事。“屏蔽底层的繁琐工作,让程序员将注意力集中于业务逻辑本身”,有需求就有生产力进步,于是各式各样的nio框架涌现而出,而笔者使用到的是其中最常见的两种:xSocket和MINA。
1 xsocket框架
官网:http://xsocket.sourceforge.net/
xSocket是一套非常简洁的nio框架,利用这套框架,你可以在完全不了解nio的情况下设计出高并发的socket服务器。
server端代码:
- public class ProjectServer extends Thread {
- private static final int PORT=9099;
- public void run() {
- IServer srv = null;
- try {
- //建立handler
- srv = new Server(PORT, new ProjectHandle());
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //服务器运行
- srv.run();
- System.out.println("The ProjectServer start on port: "+PORT);
- }
- public static void main(String[] args) {
- ProjectServer projectServer = new ProjectServer();
- projectServer.start();
- }
- }
handler代码
- public class ProjectHandle implements IDataHandler, IConnectHandler,
- IDisconnectHandler {
- /* 处理连接建立事件 */
- @Override
- public boolean onConnect(INonBlockingConnection nbc) throws IOException,
- BufferUnderflowException, MaxReadSizeExceededException {
- // TODO Auto-generated method stub
- System.out.println(nbc.getId() + "is connect!");
- return true;
- }
- /* 处理连接断开事件 */
- @Override
- public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {
- // TODO Auto-generated method stub
- System.out.println(nbc.getId() + "is disconnect!");
- return true;
- }
- /* 处理接受数据事件 */
- @Override
- public boolean onData(INonBlockingConnection nbc) throws IOException,
- BufferUnderflowException, ClosedChannelException,
- MaxReadSizeExceededException {
- // TODO Auto-generated method stub
- String str = nbc.readStringByDelimiter("\0");
- System.out.println(str);
- return true;
- }
- }
这里我们以"\0"为间隔读取数据,xSocket还提供按照长度读取以及全部读取到一个ByteBuffer几种读取数据的方式,如果传递过程中采取byte数组格式,在接受数据时还可以使用xSocket自带的工具类DataConverter进行转化。譬如接收数据时如此操作:
- ByteBuffer copyBuffer = ByteBuffer.allocate(20000);
- nbc.read(copyBuffer);
- copyBuffer.flip();
- String str = DataConverter.toString(copyBuffer, "utf-8");
就可以将二进制格式的传输内容还原为原始字符串了。
需要说明的是虽然xSocket代码简单、开发快捷,但是由于太“上层”了,所以很多地方不利于coder自己控制。譬如socket通信中一个很常见的“半包连包”问题用xsocket处理起来就会很麻烦,而且如果传输协议是经过特殊设计的,xsocket也无法像mina那样自己编写解码器。当然如果你不是特别计较这些方面,那么非常适于上手的xSocket就是适合你的nio框架。
3 MINA
项目主页:http://mina.apache.org/
闲话不说,上代码
- public class Server extends Thread {
- private static final int PORT = 23;
- public void run() {
- IoAcceptor acceptor = new NioSocketAcceptor();
- acceptor.setHandler(new TestHandler());
- acceptor.getFilterChain().addLast("codec",
- new ProtocolCodecFilter(new TextLineCodecFactory()));
- acceptor.getSessionConfig().setReadBufferSize(2048);
- acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
- try {
- acceptor.bind(new InetSocketAddress(PORT));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("The ProjectServer start on port: " + PORT);
- }
- public static void main(String[] args) {
- Server server = new Server();
- server.start();
- }
- }
- public class TestHandler extends IoHandlerAdapter {
- @Override
- public void exceptionCaught(IoSession session, Throwable cause)
- throws Exception {
- // TODO Auto-generated method stub
- session.close(true);
- }
- @Override
- public void sessionCreated(IoSession session) throws Exception {
- // TODO Auto-generated method stub
- System.out.println("the new session is connecting");
- }
- @Override
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- // TODO Auto-generated method stub
- String str = message.toString();
- System.out.println(str);
- }
- }
最简单的一个mina服务器实现,telnet就可以看到效果。
稍微解释一下
mina的实现主要在于给IoAcceptor增加过滤器
new ProtocolCodecFilter(new TextLineCodecFactory()):这是一个解码器,可以自己实现ProtocolCodecFactory接口编写特定的解码器。不过注意一下,解码器必须和编码器同时使用,服务器端实现特定解码器的同时需要客户端应用特定编码。
常用过滤器还有日志LoggingFilter()等,具体可以查看api。
这里笔者想说的是对于一般的socket服务器,可能客户端并不会使用mina,譬如j2me或者干脆是一个c++的socket请求,此时我们上面的demo将毫无作用,具体来说就是解码过滤器失效。在实际应用中,我们一般是这样的处理的:
- public class Server extends Thread {
- private static final int PORT = 11001;
- public void run() {
- IoAcceptor acceptor = new NioSocketAcceptor();
- acceptor.setHandler(new TestHandler());
- acceptor.getFilterChain().addLast("ddd", new StreamWriteFilter());
- acceptor.getSessionConfig().setReadBufferSize(2048);
- acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
- try {
- acceptor.bind(new InetSocketAddress(PORT));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("The ProjectServer start on port: " + PORT);
- }
- public static void main(String[] args) {
- Server server = new Server();
- server.start();
- }
- }
注意我们并没有再使用acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory()));
而是acceptor.getFilterChain().addLast("ddd", new StreamWriteFilter());
这个过滤器是直接对写入流操作,即原始的数据流
handler端代码也要修改
- public class TestHandler extends IoHandlerAdapter {
- @Override
- public void exceptionCaught(IoSession session, Throwable cause)
- throws Exception {
- // TODO Auto-generated method stub
- session.close(true);
- }
- @Override
- public void sessionCreated(IoSession session) throws Exception {
- // TODO Auto-generated method stub
- System.out.println("the new session is connecting");
- }
- @Override
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- // TODO Auto-generated method stub
- IoBuffer buffer=(IoBuffer)message;
- ByteBuffer bf= buffer.buf();
- byte[] tempBuffer=new byte[bf.limit()];
- bf.get(tempBuffer);
- String str=new String(tempBuffer);
- System.out.println(str);
- }
- }
注意这段
- IoBuffer buffer=(IoBuffer)message;
- ByteBuffer bf= buffer.buf();
- byte[] tempBuffer=new byte[bf.limit()];
- bf.get(tempBuffer);
- String str=new String(tempBuffer);
- System.out.println(str);
将原始的数据流还原为字符串,如果传输协议不是字符串而是byte数组,就直接对tempBuffer操作即可。
发表评论
-
解决 PermGen space Tomcat内存设置
2011-05-10 15:30 2108在操作一段时间就会出现 java.lang.OutOfMemo ... -
proxool 多数据源动态切换,刚刚一网友问我,顺便写的一个demo
2010-09-27 17:39 2276package aa; import java.io.F ... -
(转)sql批量执行效率对比
2010-05-24 18:10 3158环境: MySQL 5.1 RedHat L ... -
转自CSDN以作备份,使用java获取文档的编码格式
2010-05-24 09:57 1233package com.util.mail; import ... -
从bbs中看到的问题:从大量数据中取top100,整理的思路
2010-04-01 14:13 1533TreeSet算法很强悍,以后一定要记得使用 p ... -
Eclipse导出JavaDoc中文乱码问题解决
2010-03-09 10:38 1039给 javadoc.exe 加上编码参数就OK。 ... -
搞懂java中的synchronized关键字
2009-12-18 14:38 993实际上,我关于java的基础知识的90%以上都来自Thinki ... -
JDialog 居中 方法二同样适合jFrame
2009-11-18 11:55 2834方法一调用JDialog的public void setLoc ... -
如果查询数据的时候报内存溢出咋办?
2009-10-30 10:45 1380前两天搞了个程序,需要一次性导出大量数据,在执行select的 ... -
关于java堆栈溢出的那些事
2009-08-31 09:47 2922java.lang.OutOfMemoryError: Jav ... -
手工将tomcat安装为服务及tomcat命令说明
2009-06-09 09:04 1768最近做了一个项目需要将tomcat和产品功能 ... -
Java 读取 INI 文件的示例
2009-05-19 18:15 1229package com.wfy.util; import ... -
java数据流压缩
2009-05-14 17:53 3603package com.wfy.util; import ... -
用java发送邮件
2009-05-13 13:33 1426<%@page contentType="te ... -
java窗口最小化到任务栏
2009-05-07 11:46 4164import java.awt.AWTException; ... -
Java 读/写文件文本文件的示例
2009-04-24 08:38 1095/* * 简单的读/写文本 ... -
java读写消息资源文件
2009-04-23 15:46 1679package com.lwf.util; import ... -
如果 点击子窗口父窗口也随之关闭 请看
2009-04-23 13:11 1906如果点击子窗口关闭按钮,父窗口也关闭了,可能是设置的问题 ... -
读取资源文件的N种方法- -
2009-04-23 09:37 1188如何读取资源文件:(一)Properties props = ... -
HTMLParser的使用
2009-03-11 17:32 1920一. 简介 htmlparser用于 对html页 ...
相关推荐
基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络...
NIO网络框架 xSocket
JAVA源码NIO网络框架xSocket
MINA (Java Multithreaded Network Application Framework) 是一个基于NIO的开源框架,它为开发高性能、高可用性的网络应用提供了抽象层。MINA 提供了事件驱动的模型,简化了网络编程的复杂性,开发者可以通过编写...
java资源NIO网络框架 xSocket提取方式是百度网盘分享地址
3. 文档资料:包含了框架的使用指南、API文档以及设计原理等,帮助开发者更好地学习和使用xSocket。 4. 测试用例:验证框架功能的正确性,可作为开发过程中参考和调试的依据。 5. 配置文件:可能包含服务器配置、...
Java NIO(New Input/Output)网络框架是一...通过学习和使用xSocket框架,开发者可以更好地理解和应用Java NIO,创建出高效、可靠的网络应用程序。在实际开发中,结合NIO的特性,可以显著提升网络应用的性能和稳定性。
xSocket是一款基于Java NIO实现的高性能网络通信框架,它为开发者提供了更简单、更高效的网络编程接口。 在Java NIO中,核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。通道是数据传输的途径...
Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,...通过深入学习和实践xSocket源码,不仅可以提升Java NIO的技术能力,还可以为将来构建自己的网络框架打下坚实基础。
xSocket是一个基于Java NIO实现的网络通信框架,它提供了高性能、稳定可靠的网络连接管理。 1. **Java NIO基础**: - **通道(Channels)**:通道是数据传输的路径,可以连接到不同类型的I/O设备,如文件、套接字...
xsocket NIO框架示例 resources 中有相关的 资料。telnet服务测试教程。和相关jar
xSocket是一个基于Java NIO实现的网络通信框架,它的设计目标是提供高效、稳定、易用的网络编程接口。xSocket通过使用NIO的多路复用器(Selector)来监听多个套接字通道,当有数据可读或可写时,Selector会唤醒线程...
Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...
通过研究xSocket的源码,我们可以学习到如何有效地利用Java NIO进行网络编程,如何设计高效的事件驱动架构,以及如何优化网络通信性能。这对于任何希望构建高性能、高并发网络应用的Java开发者来说,都是宝贵的实践...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
在这个"网络编程(socket、NIO、mina)---demo"的主题中,我们将深入探讨三个关键概念:Socket编程、非阻塞I/O(Non-blocking I/O,简称NIO)以及Apache Mina框架。这些技术广泛应用于构建高性能、高并发的网络应用...
2005年至2008年间,随着Java技术的快速发展和各种开源框架的涌现,华为电信软件开始转向Java开发。这一时期的典型架构是基于Spring、Struts和Tomcat的MVC架构。数据访问层主要采用iBatis和Hibernate等框架。这种转变...
NIO (Non-blocking Input/Output) 和 MINA (Multipurpose Infrastructure for Network Applications) 是Java中用于高性能网络应用的两个重要框架。NIO是Java标准库的一部分,提供了与传统IO(Blocking I/O)不同的I/...