$home=org.apache.mina
启动过程中,主要业务开始于
$home.core.polling.AbstractPollingIoAcceptor.Acceptor
线程类监听,
case1:未初始化server,进行绑定初始化
具体绑定代码在
$home.transport.socket.nio.NioSocketAcceptor.open(SocketAddress localAddress){
channel.configureBlocking(false);
//部分代码
ServerSocketChannel channel = ServerSocketChannel.open();
ServerSocket socket = channel.socket();
socket.setReuseAddress(isReuseAddress());
socket.bind(localAddress, getBacklog());
channel.register(selector, SelectionKey.OP_ACCEPT);
}
case2:clent的其他事件
$home.polling.AbstractPollingIoAcceptor.Acceptor.processHandles(Iterator<H> handles){
A.获取session
S session = accept(processor, handle);
B.初始化session
initSession(session, null, null);
C.启动线程处理事件
session.getProcessor().add(session);
}
A中accept方法调用
$home.transport.socket.nio.NioSocketAcceptor.accept(IoProcessor<NioSession> processor, ServerSocketChannel handle){
SelectionKey key = handle.keyFor(selector);
// 部分代码
SocketChannel ch = handle.accept();
return new NioSocketSession(this, processor, ch);
}
C中add方法会调用
$home.core.polling.AbstractPollingIoProcessor.startupProcessor(){
//D
Processor processor = processorRef.get();
//部分代码,启动新线程处理事件
if (processor == null) {
processor = new Processor();
if (processorRef.compareAndSet(null, processor)) {
executor.execute(new NamePreservingRunnable(processor, threadName));
}
}
}
D处的Processor是内部类$HOME.polling.AbstractPollingIoProcessor.Processor.
是一个线程类,其中主要业务方法
read(S session){
//部分代码
IoSessionConfig config = session.getConfig();
//用到了启动server时的session配置
int bufferSize = config.getReadBufferSize();
IoBuffer buf = IoBuffer.allocate(bufferSize);
final boolean hasFragmentation = session.getTransportMetadata().hasFragmentation();
try {
int readBytes = 0;
int ret;
try {
if (hasFragmentation) {
while ((ret = read(session, buf)) > 0) {
readBytes += ret;
if (!buf.hasRemaining()) {
break;
}
}
} else {
ret = read(session, buf);
if (ret > 0) {
readBytes = ret;
}
}
} finally {
buf.flip();
}
//有内容,依次调用配置的filter
if (readBytes > 0) {
IoFilterChain filterChain = session.getFilterChain();
filterChain.fireMessageReceived(buf);
buf = null;
if (hasFragmentation) {
if (readBytes << 1 < config.getReadBufferSize()) {
session.decreaseReadBufferSize();
} else if (readBytes == config.getReadBufferSize()) {
session.increaseReadBufferSize();
}
}
}
}
分享到:
相关推荐
mina mmorpg服务端源码 采用amf3编解码格式
mina服务端工程例子包括相关源码,实现了socket 的nio
本源码是《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》一文的MINA2服务端源码实现,详见:http://www.52im.net/thread-373-1-1.html
mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表... * 2、如果不想启动springboot,可以单独运行mina服务端的main方法。
我是个新手,有出错的地方莫怪哈,把源码发布出来更多的是想大伙帮忙改进下框架,改进的代码和新版本希望能够发到我的邮箱:xiamiy01@gmail.com,我会把新的修改和新版本发布出来,为大家服务。 文件夹简介: ...
一个源代码学习服务端 ,基于mina 。控制单位可以加载csv和读取xml
NULL 博文链接:https://aniyo.iteye.com/blog/1609337
本源码是《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》一文的Java客户端源码实现,详见:http://www.52im.net/thread-373-1-1.html
本项目使用JAVA + MINA + ServiceLoader实现交通部809协议服务端代码。代码中完成了主链路部分,包括对客户端登录验证及应答,注销及应答,保持连接及应答,接收实时定位数据及历史定位数据等。如果扩充新业务只需要...
NULL 博文链接:https://bjyzxxds.iteye.com/blog/1267685
代码利用mina框架实现了服务器端和客户端,客户端的登录请求、客户端向服务器端请求图片文件的功能。代码分为服务端和客户端,开发环境eclipse。服务器代码可在web项目中使用,客户端代码可以在Android开发时使用,...
基于Mina的网络通讯,分为服务端和客户端。 研究selector NIO实现时,发现了这个架构。 Mina的底层实现实际就是selector和SocketChannel。所以如果对Mina源码感兴趣的可以先去看下selector相关的例子。
本源码是《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》一文的服务端实现(MINA2版),详见:http://www.52im.net/thread-378-1-1.html
01、Mina服务端helloWorld入门.flv 02、Mina客户端helloWorld入门.flv 03、Mina整体体系结构分析.flv 04、Mina学习之长短连接.flv 05、Mina学习之MinaIOService接口.flv 06、Mina学习之MinaIOFilter接口.flv ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
冒险岛源码。服务端源码、需要自己去找SQL,不包含部分内容。 基于java语言。通讯部分mina。
NULL 博文链接:https://qianhao-1987.iteye.com/blog/1476125
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...