nSocket设计概要version0.1

之前一直在分析mina的源码,mina是一个基于java NIO.1的高性能网络框架,实现了网络传输的异步和非阻塞模式。在mina源码分析的一系列文章中,我主要还是基于mina实现的组织结构和部分细节进行分析。看了那么久的源码,想根据NIO的应用结合对mina的学习也写个类似的代码。我也就不取一个跟我写框架之类的代码了,我也就写着玩儿的,还真没那么高的实力确保能写出来,大家看看就罢了。

本文将介绍nSocket的大致设计思路以及代码结构。nSocket也将应用于网络通信层,基于java NIO.1和NIO.2编写,主要实现传输的异步和非阻塞。写这个框架的目的是为了能使NIO的程序写起来更方便,也是对基本NIO的一个封装来扩展部分功能。考虑到java的更新,之前的异步操作都是用线程间的协同和队列来实现的,实现难度也比较高,而NIO.2自带了异步通信的工具,所以打算增加这部分的功能。

这几天写了个0.1版本,主要实现了两端的连通。代码都挂在了git hub上:https://github.com/ielts0909/nSocket.git。代码大家就随便看看,这是一个长期的规划,不是简单的封装,现在还写的不好,还有很多需要改进的地方,不过总算迈出第一步了。

在这个版本下,我将介绍下具体的设计思路和后续的扩展,各类之间的关系如下:

com.a2.nsocket.core.service:定义连接的最基本操作,以及管理连接的相关接口和初步实现。

com.a2.nsocket.core.session:处理连接连通之后的内部细节。

com.a2.nsocket.core.handlerhandler提供给用户接口做方便的相关通信操作。

com.a2.nsocket.core.polling:主要负责selector的轮询工作。

com.a2.nsocket.transport.*:主要负责实现连通的细节工作,实现service中定义的部分接口。

在后续的设计中还会增加拦截器filter,通过拦截器实现对功能的进一步扩展。

nSocket设计概要version0.1

根据最新设计,上图更改为如下所示,主要对session进行了新的定义,具体会在0.1.2版本说明中更新:

nSocket设计概要version0.1

下面写点儿已经完成的代码,在服务器端采用IoAcceptor来开启服务,接收端采用IoConnector来发起请求,两者均集成自IoCommunicate。具体结构如下图:

nSocket设计概要version0.1

采用这样复杂的方式来实现主要还是为了扩展和限制。扩展比较好容易,如果我们看上图的左边,为了引出NioSocketAcceptor,我做了三层接口,现在我是TCP的连接,如果我是UDP的连接,我就可以从IoAcceptor层开始扩展,如果我要将阻塞和非阻塞、异步与同步分开实现,那我就可以从SocketAcceptor进行扩展。同样的,这么做的目的也是为了限制,对外开放通用的操作,将具体细节隐藏在内部。这一点我们可以看session的设计:

nSocket设计概要version0.1

IoSession中暴露了对外的操作,因为IoSession是用户获得session的方式,而用socketSession接口来定义一些内部的实现细节:

public interface IoSession {

	IoHandler getHandler();

	void write(Object message) throws IOException;

	void broadcast(Object message);

	Object read();
}

public interface SocketSession {
	
	void setKey(SelectionKey key);
	
	void setSelecotr(Selector selector);
	
	void setIsServerChannel(boolean isServerChannel);
}

session中定义了对外常用的读写操作,而对内部的操作都放在了另一个接口中。当然session还有很多的功能,在这一版中,就没有做那么多的实现。

最后看看IoHandler定义的操作:

public interface IoHandler {
	
	/**while doing the init in socket --binding*/
	void sessionOpening() throws Exception;

	void sessionClosed() throws Exception;
	
	/**when accept or connect */
	void sessionOpened(IoSession session) throws Exception;
	
	/**when message receives*/
	void messageReceive(IoSession session, Object message) throws Exception;
	
	void messageSend(IoSession session, Object message) throws Exception;

	void execptionCaught(IoSession session, Throwable cause);
}

Handler还是采用adapter的模式对其进行扩展,也可以由开发者自行扩展。这样的写法分离了NIO常见的在一个大循环里处理完一切事务,将业务和具体实现细节分开来了。

当然这么多说下来,目前的程序还是很简单,实现的功能也很简单,只是实现了下两方的握手,并没有进行实质性的、大面积的交互,不过这只是一个基础,这部分的内容基本可以打底了,但是在实现过程中我也发现一些问题:

l  怎样有效处理pollingsessionservice之间的线程间通信

l  如何做好线程安全的问题

还有很多这里就不列举了,这毕竟是0.1版本,后续会慢慢写下去,也有可能在读了其他代码之后会推翻重写,不过能迈出去写点儿框架也确实对自己很有帮助。nSocket设计概要version0.1

在下一版的内容中会先考虑增加filter的处理(UDPAIO的实现都是横向扩展,所以可以放一放),因为代码的结构需要一遍一遍的改,还是稍稍改变下战略,把功能都实现了,然后再一步步重构代码,提高代码质量。

nSocket设计概要version0.1


你可能感兴趣的:(java,nio,Mina,nSocket)