`
unbounder
  • 浏览: 171712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

常见NIO开源框架(MINA、xSocket)学习 2

阅读更多
【承上文http://unbounder.iteye.com/blog/481396

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操作即可。



附件中为mina的jar包和所以来的slf4j的jar包,欢迎下载。
3
3
分享到:
评论
4 楼 nishizhutou 2009-11-22  
newthinker 写道
lz对xsocket理解的并不彻底,xsocket对你的所谓半包连包问题是专门提供了对应的api处理的,你没用罢了。而且xsocket的确是要比mina好用一百倍的,mina太过复杂,对nio的封装也不彻底。还有mina提供了侵入用户应用程序对于通讯协议的自定义。它提供的不伦不类的decoder和encoder简直是胡扯。我们不需要这样的概念,这些概念交给用户应用程序即可。nio框架只需要负责高效传输io流即可,对于io的字节提供应用程序解析时的方便就行了。xsocket就是这么设计的。


也不能说mina的侵入式处理方式完全无用,通过侵入可以使得效率可以进一步提高.
3 楼 unbounder 2009-10-30  
newthinker 写道
lz对xsocket理解的并不彻底,xsocket对你的所谓半包连包问题是专门提供了对应的api处理的,你没用罢了。而且xsocket的确是要比mina好用一百倍的,mina太过复杂,对nio的封装也不彻底。还有mina提供了侵入用户应用程序对于通讯协议的自定义。它提供的不伦不类的decoder和encoder简直是胡扯。我们不需要这样的概念,这些概念交给用户应用程序即可。nio框架只需要负责高效传输io流即可,对于io的字节提供应用程序解析时的方便就行了。xsocket就是这么设计的。

谢谢指教,确实对xsocket了解并不多,学习了
2 楼 jenlp520 2009-10-20  
现在还有个问题就是
当我传的时候用的是16进制的字节流
IoBuffer buffer=(IoBuffer)message;  

debug的时候在buffer里面还是16进制 结果我在
bf.get(tempBuffer);  

tempbuffer里面取的时候就自动给我转成10进制了 请问下能否直接从buffer里面取得16进制的
因为连接的是C++的原因 无符号的byte自动转会出错
1 楼 jenlp520 2009-10-20  
LZ真是太感谢你啦!

相关推荐

    常见NIO开源框架(MINA、xSocket)学习

    常见NIO开源框架(MINA、xSocket)学习 基于io包的阻塞式socket通信代码简单,在连接数很少的情况下是一个不错的选择。不过实际应用中一个socket服务器采用传统的阻塞式socket方式通信可能会是一场灾难,一路...

    轻量级网络通信框架nSocket.zip

    nSocket是基于java NIO.1和NIO.2开发的轻量级网络通信框架,该框架为用户提供异步非阻塞的网络编程接口。目前更新到0.1版本,实现了基本的连通性和简要的通信,在0.2版本中将增加filter chain的功能。nSocket与mina...

    java开源包6

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包9

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包2

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包8

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包10

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包1

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包3

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包11

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包5

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包7

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包4

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    java开源包101

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    Java资源包01

    xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的...

Global site tag (gtag.js) - Google Analytics