设为首页 收藏本站
查看: 688|回复: 0

[经验分享] apache mina第一发-初体验

[复制链接]

尚未签到

发表于 2017-1-4 11:18:26 | 显示全部楼层 |阅读模式
闲来无事来一发博客,最近看了看apache mina,研究了下一些文档里的程序,今天在这里记录一下。
  简单介绍一下Apache Mina,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
  首先是开发环境的配置,我们需要在官网下载apache的jar包,可以直接把所有的jar包都加进build path中。另外,我们需要添加几个额外的包,可以在slf4j的官网上下载到,配置好后的build path如下图所示,阴影部分的包是上面说的需要另外下载的。
  
DSC0000.png
  然后就是写我们的第一个程序了。首先是服务端的代码,MainServer类主要负责连接的建立

package mina.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MainServer {
/**
* 程序入口
* @param args
*/
public static void main(String [] args){
//创建一个非阻塞的Server端Socket
SocketAcceptor acceptor = new NioSocketAcceptor();
//创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定这个过滤器将一行一行地读取数据
chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定服务器的消息处理器:一个MyHander对象
acceptor.setHandler(new MyHandler());
//设定服务器绑定的端口
int bindPort=9988;
//绑定端口,启动服务器
try {
acceptor.bind(new InetSocketAddress(bindPort));
} catch (IOException e) {
System.out.println("启动失败");
e.printStackTrace();
}
System.out.println("Mina 已经在端口"+bindPort+"启动");
}
}

  
 与Java中传统的I/O方式不同,Mina 走的是NIO的套路,Mina服务器中的ServerSocket叫做Acceptor,它在绑定端口号之前需要设置过滤器(与Java web中的过滤器十分相似),而且需要设置一个Handler,这个handler十分重要,处理消息的逻辑都是在它里面的。所有的Handler都需要实现IoHandler接口,或者继承它的实现类IoHandlerAdapter,并重写里面的方法,以下是MyHandler类

package mina.server;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class MyHandler extends IoHandlerAdapter {
/**
* 当一个客户端连接进入时
*/
public void sessionOpened(IoSession session) throws Exception{
System.out.println("新接入的客户端"+session.getRemoteAddress());
}
/**
* 当一个客户端断开连接时
*/
public void sessionClosed(IoSession session){
System.out.println("客户端断开连接");
}
/**
* 当有信息发来时
*/
public void messageReceived(IoSession session,Object message){
String s = message.toString().trim();
System.out.println("收到客户端发来的消息:"+s);
session.write(s);
count++;
}
private int count = 0;
}

  我们在这里看到的三个方法都是重写的,Mina中把通信抽象成事件处理的机制,我们只需要编写对应的事件响应函数就好了。这里当我们的服务器收到一条消息之后,就把它原封不动地转发到客户端。
  然后是客户端部分的代码

package mina.client;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class MainClient {

public static void main(String [] args) throws Exception{
NioSocketConnector connector = new NioSocketConnector();
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));
connector.setHandler(new MyClientHandler());
connector.setConnectTimeout(30);
ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",9988));
cf.awaitUninterruptibly();
cf.getSession().getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
}


package mina.client;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class MyClientHandler extends IoHandlerAdapter {
public void sessionOpened(IoSession session) throws Exception{
System.out.println("连接到服务器");
session.write("我来了");
}
public void sessionClosed(IoSession session){
System.out.println("与服务器断开连接");
}
public void messageReceived(IoSession session,Object message){
String s = message.toString().trim();
System.out.println("服务器发来的收到消息:"+s);
session.write(s);
}
}

  当客户端连接到服务器之后,就给服务器发一条“我来了”的消息,而当收到服务器发来的消息之后,就把它原封不动地转发到服务器。
  各位不妨想象一下程序运行的结果,然后动手试一试
  最后总结一下用Mina写简单通信程序的流程:
  服务器端:
  1.新建SocketAcceptor
  2.设置Filter链
  3.编写并设置IoHandler
  4,.绑定端口
  客户机端:
  1.新建SocketConnector
  2.设置Filter链
  3.编写并设置IoHandler
  4.连接服务器

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323797-1-1.html 上篇帖子: apache poi 读写xlsx文件简单示例 下篇帖子: Apache HttpClient 4.3-忽略证书问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表