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

本文介绍了一个简单的MINA服务器实现,并通过代码示例展示了如何配置MINA服务器,包括使用过滤器进行解码和处理原始数据流的方法。
【承上文[url]http://unbounder.iteye.com/blog/481396[/url]】

[b]3 MINA[/b]
项目主页: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();
}
}

注意我们并没有再使用[color=gray]acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory()));[/color]
而是[color=red]acceptor.getFilterChain().addLast("ddd", new StreamWriteFilter());[/color]
这个过滤器是直接对写入流操作,即原始的数据流

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包,欢迎下载。
下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值