欢迎阅读我的开源项目《迷你微信》服务器与《迷你微信》客户端
序言Apache MINA(Multipurpose Infrastructure for Network applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。 ——搜狗百科
Mina是Java的一个网络框架,它能帮你处理和隐藏许多网络模块的处理,对许多功能的使用,如filter,Handler,连接等进行了封装,方便程序员的使用,关于Mina框架的详细学习,请自行阅读官网教程。
Mina的配置要使用Mina框架,首先要导入几个Jar包:
slf4j-log4j12.jar and log4j-1.3.x.jar can not be used together, and will malfunction. ——来自官网-配置Mina
如官网所说,导入jar包的版本是需要注意的,比如slf4j-log4j12.jar不能和log4j-1.3.x.jar一起使用,会导致崩溃(?Д?≡)
技术基础在了解Mina框架之前,首先要对一些网络的基本概念进行一些了解。
NIO与BIOMina支持对TCP和UDP的使用:
TCP协议无非是在UDP上面加了一层数据校验嘛╮(╯▽╰)╭,TCP协议额相较于UDP协议,在带宽的占用量上多了一些,但却省去了程序员处理数据包丢失,乱序的不少功夫;当然,选择哪个协议进行制作,要根据项目的需求进行区分,大多数时候我们用的是TCP协议,但在一些不太在乎数据有效性的需求上,如实时通话,可以使用UDP协议来减少带宽的消耗。
Mina的连接我们先来做一个简单的Mina连接,(代码来自开源项目《迷你微信》服务器)
public class ServerNetwork {priv}ate InetSocketAddress inetSocketAddress;private IoAcceptor acceptor;public void init() {// 自己写的,负责处理网络层回调的类MinaServerHandle minaServerHandle = new MinaServerHandle// 建立一个NIO(非阻塞)的连接acceptor = new NioSocketAcceptor();acceptor.setHandler(minaServerHandle);try {// 绑定端口acceptor.bind(new InetSocketAddress(8081));} catch (IOException e) {e.printStackTrace();}}public static void main(String args[]) {new ServerNetwork().init();}}
接下来,我们来编写处理Mina网络层回调的Handler,它在连接,打开,发送,接收,关闭,异常等情况下都会调用其回调
// 负责处理网络层回调的类,需要继承IoHandlerAdapter public class MinaServerHandle extends IoHandlerAdapter {@Overridepublic void messageReceived(IoSession ioSession, Object message) {System.out.println("从输入留读入时调用");}@Overridepublic void sessionClosed(IoSession session) throws Exception {System.out.println("关闭连接时调用");}@Overridepublic void exceptionCaught(IoSession session, Throwable cause) {System.out.println("发生异常时调用");}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("客户端发起一个新连接时调用");}@Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println("连接开启时调用");}@Overridepublic void sessionIdle(IoSession session, IdleStatus status) throws Exception {System.out.println("连接空闲的时调用");}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {System.out.println("往输出流写数据时调用");}}
到此,一个简单的Mina非阻塞连接就建立起来了。当客户端发来新的数据时,会调用messageReceived方法;而服务器往客户端发送时只需要直接对这个IOSession尽心write操作即可iosession.write("要发送的内容");
网络连接是一种不稳定的连接,丢包,乱序问题还能通过程序来解决,但是断线问题,就没办法了。所以,服务器与客户端的一些重要的通信,必须要保证断线也不会丢失,至少要保证知道对方未收到的问题,进行后续的处理。
在这里告诉大家一个服务器端向IO流写的小技巧,帖主在刚开始使用Mina的时候还学习的太少,不知道Mina在TCP发送数据时是有回调函数的,即“发送成功”、”发送失败“等等信息,还自己写了个客户端的”收到某消息回复“的接口╮(╯﹏╰)╭先介绍一下如何查看发送是否成功。(代码来自开源项目《迷你微信》服务器)
iosession.write("WTF");WriteFuture writeFuture = user.ioSession.write(packetWillSend);writeFuture.addListener(new IoFutureListener<IoFuture>() {@Overridepublic void OperationComplete(IoFuture future) {if (((WriteFuture) future).isWritten()) {// 发送成功} else {// 发送失败}}});
简单的说就是添加一个监听,然后在有结果(成功?失败)的时候,Mina将会自动调用operationComplete方法,再根据IoFuture获取结果。
欢迎阅读我的开源项目《迷你微信》服务器与客户端
新闻热点
疑难解答