【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。 ——搜狗百科
序言
Mina是Java的一个网络框架,它能帮你处理和隐藏许多网络模块的处理,对许多功能的使用,如filter,Handler,连接等进行了封装,方便程序员的使用,关于Mina框架的详细学习,请自行阅读官网教程。
Mina的配置
要使用Mina框架,首先要导入几个Jar包:
- mina-core-2.0.7.jar
- mina-example-2.0.7.jar
- slf4j-api-1.6.6.jar
- slf4j-log4j12-1.6.6.jar
- log4j-1.2.17.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与BIO
- NIO(non-blocking IO) :非阻塞式IO,对网络的读写采用非阻塞式,可进行并发处理。
- BIO(Blocking IO): 阻塞式IO, 对网络的读写采用阻塞式,在完成读写操作前将完全无法操作。
在此,我们主要讨论Mina的NIO(非阻塞式IO),在NIO的使用中,IO操作不阻塞程序的运行,所以你只要设置好IO操作的回调函数便可,当读操作发生时,Mina会自动调用你编写的回调函数,进行处理;写操作也是同样,只要调用IOSession.write(myContent),Mina便会是异步进行处理。当然这些处理都是Mina帮你封装好的,使用者不需要过多的了解。如何建立NIO连接会在后面慢慢细说。
TCP与UDP
Mina支持对TCP和UDP的使用:
- TCP (Transmission Control Protocol) :传输控制协议,在进行服务器与客户端的通信时,会对数据传输进行校验,防止因网络问题导致的丢包与乱序问题。
- UDP (User Data Protocol) :用户数据报协议,在服务器与客户端的通信过程中,不对数据的有效性进行校验,即发送端不在乎接收端是否接收到正确有序的数据。
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 {
@Override
public void messageReceived(IoSession ioSession, Object message) {
System.out.println("从输入留读入时调用");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("关闭连接时调用");
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
System.out.println("发生异常时调用");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("客户端发起一个新连接时调用");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("连接开启时调用");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
System.out.println("连接空闲的时调用");
}
@Override
public 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>() {
@Override
public void operationComplete(IoFuture future) {
if (((WriteFuture) future).isWritten()) {
// 发送成功
} else {
// 发送失败
}
}
});
简单的说就是添加一个监听,然后在有结果(成功?失败)的时候,Mina将会自动调用operationComplete方法,再根据IoFuture获取结果。
【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接的更多相关文章
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 <迷你微信>服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议
欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate
目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 前面我们讲到<迷你微信>服务器端的主架构,现在我们来描述一下它的模块详细信息. 网络模块 从上图我 ...
随机推荐
- 利用KeyVault来加强存储Azure Storage访问密钥管理
很多时候管理Azure的存储账号我们都需要通过下面的界面管理访问密钥,大部分情况下通过密钥的轮替使用更新就可以做到安全管理了. 但是很多时候存储账号的Key就会不小心分发到开人员.测试人员.和管理员手 ...
- 洛谷P1828 香甜的黄油 Sweet Butter
P1828 香甜的黄油 Sweet Butter 241通过 724提交 题目提供者JOHNKRAM 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 我的SPFA为什么TLE.. 为 ...
- Java基础学习(学习IT企业必读的324个JAVA面试题.pdf 整理)
一.Java程序基础 javac 文件名.java 编译程序 java 类名 运行java程序 代码规范中,一下几点要注意: 包名:包名是全小写的名词,中间可以由点分 ...
- MySQL版本调研
1引言 1.1 编写目的 本文的主要目的是通过对当前项目中使用的各种版本的数据库进行比较,分析各自特性和稳定程度,最终推荐合适的版本作为今后的标准数据库. 1.2 背景 当前,部门负责管理维护的现网使 ...
- javascript设计模式-适配器模式
适配器模式的主要作用是将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些对象(类)可以一起工作. UML示意图: 例如,鸭子有fly方法和quack(嘎嘎 ...
- 【C#基础】static 关键字用法小结
静态变量 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用. 有时候,我们希望 ...
- solr5.5教程-tomcat布署
tomcat和solr在各自官网下载,版本如下: tomcat版本:8.0.24 solr版本:5.5.0 1.solr解压后,目录结构如下: 2.tomcat的webapps里新建solr目录, 把 ...
- Python之路【第七篇】:线程、进程和协程
Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- java实现 swing模仿金山打字 案例源码
java实现 swing模仿金山打字 案例源码,更多Java技术就去Java教程网.http://java.662p.com 代码: <font size="3">im ...
- MySql安装方法和配置、解决中文乱码
MySql Server安装步骤 1安装MySql Server 2 安装MySqlServer管理工具 解压中文语言包,将文件复制到安装目录下覆盖 文件覆盖后,打开软件设置语言为中文(CN) 3 M ...
