android开发学习——Mina框架

Apache Mina Server 是一个网络通信应用框架,对socket进行了封装。

http://www.cnblogs.com/moonandstar08/p/5475766.html 

http://blog.csdn.net/u010739551/article/details/47361365 

http://www.cnblogs.com/yanghuiping/p/4108063.html  (mina 自定义编解码)

Client端:

public class MinaClient {public static void main(String[] args) throws Exception{
//1.NioSocketConnector connector
= new NioSocketConnector();
//2.connector.setHandler(
new MyClientHandler());
//3.所有收发的消息都会经过拦截器,经拦截器进行消息的处理connector.getFilterChain().addLast(
"codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
//4.ConnectFuture future
= connector.connect(new InetSocketAddress("127.0.0.1", 9898));future.awaitUninterruptibly();IoSession session = future.getSession();BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));String inputContent;while (!(inputContent = inputReader.readLine()).equals("bye")) {session.write(inputContent);}}}

将网络和消息处理的代码分开

public class MyClientHandler extends IoHandlerAdapter {@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {System.out.println("exceptionCaught");}@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {String s = (String) message;System.out.println("messageReceived: " + s);}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {System.out.println("messageSent");}@Overridepublic void sessionClosed(IoSession session) throws Exception {System.out.println("sessionClosed");}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("sessionCreated");}@Overridepublic void sessionIdle(IoSession session, IdleStatus status)throws Exception {System.out.println("sessionIdle");}@Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println("sessionOpened");}}

Server端:

public class MinaServer {public static void main(String[] args) {try {//1.NioSocketAcceptor acceptor = new NioSocketAcceptor();//2.网络管理和消息处理的分割开来; MyServerHandler()专门处理消息分发和会话管理acceptor.setHandler(new MyServerHandler());//3.拦截器,责任链设计模式。所有收发的消息全部要经过拦截器过滤之后,消息才可以收发;//网络上传输是字节,拦截器做对象的转换工作;//ProtocolCodecFilter 二进制数据和对象进行转化;MyTextLineFactory()内置的,对传输数据进行加解码acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyTextLineFactory()));//每隔5秒,检查客户端是否处于空闲狂态,检测客户端是否掉线acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);//4.服务器端口启动起来,监听9898acceptor.bind(new InetSocketAddress(9898));} catch (IOException e) {e.printStackTrace();}}}

 

public class MyServerHandler extends IoHandlerAdapter {@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {System.out.println("exceptionCaught");}@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {String s = (String) message;System.out.println("messageReceived: " + s);session.write("server reply: " + s);}@Overridepublic void messageSent(IoSession session, Object message) throws Exception {System.out.println("messageSent");}@Overridepublic void sessionClosed(IoSession session) throws Exception {System.out.println("sessionClosed");}@Overridepublic void sessionCreated(IoSession session) throws Exception {System.out.println("sessionCreated");}

//客户端进入空闲状态,检测 客户端 是否掉线@Override
public void sessionIdle(IoSession session, IdleStatus status)throws Exception {System.out.println("sessionIdle");}@Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println("sessionOpened");}}

 

public class MyTextLineFactory implements ProtocolCodecFactory {private MyTextLineDecoder mDecoder;private MyTextLineCumulativeDecoder mCumulativeDecoder;private MyTextLineEncoder mEncoder;public MyTextLineFactory () {mDecoder = new MyTextLineDecoder();mEncoder = new MyTextLineEncoder();mCumulativeDecoder = new MyTextLineCumulativeDecoder();}@Overridepublic ProtocolDecoder getDecoder(IoSession arg0) throws Exception {return mCumulativeDecoder;}@Overridepublic ProtocolEncoder getEncoder(IoSession arg0) throws Exception {return mEncoder;}}

 

public class MyTextLineCumulativeDecoder extends CumulativeProtocolDecoder {@Overrideprotected boolean doDecode(IoSession session, IoBuffer in,ProtocolDecoderOutput out) throws Exception {int startPosition = in.position();while (in.hasRemaining()) {byte b = in.get();if (b == '\n') {int currentPositoin = in.position();int limit = in.limit();in.position(startPosition);in.limit(currentPositoin);IoBuffer buf = in.slice();byte [] dest = new byte[buf.limit()];buf.get(dest);String str = new String(dest);out.write(str);in.position(currentPositoin);in.limit(limit);return true;}}in.position(startPosition);return false;}}

 

public class MyTextLineEncoder implements ProtocolEncoder {@Overridepublic void dispose(IoSession arg0) throws Exception {}@Overridepublic void encode(IoSession session, Object message, ProtocolEncoderOutput out)throws Exception {String s =null;if (message instanceof String) {s = (String) message;}if (s != null) {CharsetEncoder charsetEndoer = (CharsetEncoder)session.getAttribute("encoder");if (charsetEndoer == null) {charsetEndoer = Charset.defaultCharset().newEncoder();session.setAttribute("encoder", charsetEndoer);}IoBuffer ioBuffer = IoBuffer.allocate(s.length());ioBuffer.setAutoExpand(true);ioBuffer.putString(s, charsetEndoer);ioBuffer.flip();out.write(ioBuffer);}}}

 

public class MyTextLineDecoder implements ProtocolDecoder {@Overridepublic void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)throws Exception {int startPosition = in.position();while (in.hasRemaining()) {byte b = in.get();if (b == '\n') {int currentPositoin = in.position();int limit = in.limit();in.position(startPosition);in.limit(currentPositoin);IoBuffer buf = in.slice();byte [] dest = new byte[buf.limit()];buf.get(dest);String str = new String(dest);out.write(str);in.position(currentPositoin);in.limit(limit);}}}@Overridepublic void dispose(IoSession arg0) throws Exception {}@Overridepublic void finishDecode(IoSession arg0, ProtocolDecoderOutput arg1)throws Exception {}}

 

转载于:https://www.cnblogs.com/mengxiao/p/7503713.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

glibc交叉编译_TSN之linuxptp交叉编译

0 开发环境1 linuxptp是什么2 为什么要交叉编译linuxptp3 修改makefile4 修改源码5 交叉编译0 开发环境笔记本:ubuntu18.04.5,内核版本为5.3 开发板:imx8mp-evk内核版本:Linux5.4.24交叉编译工具链:fsl-imx-xwayland-g…

230. Kth Smallest Element in a BST

题目: Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BSTs total elements. Follow up:What if the BST is modified (insert/delete operations) often …

声音编码

1.脉冲编码调制PCM文件格式简介 将音频数字化,其实就是将声音数字化。最常见的方式是透过脉冲编码调制PCM(Pulse Code Modulation) 。运作原理如下。首先我们考虑声音经过麦克风,转换成一连串电压变化的信号,如图一所示。这张图的横座标为秒&…

Elastic Stack简介

Elastic Stack简介 如果你没有听说过Elastic Stack,那你一定听说过ELK,实际上ELK是三款软件的简称,分别是Elasticsearch、 Logstash、Kibana组成,在发展的过程中,又有新成员Beats的加入,所以就形成了Elast…

webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)

为什么要做dynamic import? dynamic import不知道为什么有很多叫法,什么按需加载,懒加载,Code Splitting,代码分页等。总之,就是在SPA,把JS代码分成N个页面份数的文件,不在用户刚进来…

go kegg_工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧

GO和KEGG富集分析是我们在筛选出差异表达基因之后,都会去做的套路性分析。然鹅……我相信,总有那么一些“倒霉孩子”会遇到跟我一样的窘境吧,好不容易筛选出来的差异基因,尝试了DAVID(https://david.ncifcrf.gov/)、Metascape(htt…

大龄程序员的未来在何方

来源:http://www.gad.qq.com//article/detail/30358?sessionUserTypeBFT.PARAMS.229862.TASKID&ADUIN114328649&ADSESSION1501026740&ADTAGCLIENT.QQ.5533_.0&ADPUBNO26719 作者:foruok 大家都对大龄技术人员的未来非常关心&#xff0c…

搭建Telnet服务器

搭建Telnet服务器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 可能大家都知道现在已经很少有人用TELNET服务器, 因为它传输数据是以明文的方式,我们很容易通过抓包软件讲数据进行抓包&a…

table取tr对象 vue_Vue笔记

Vue集成了React和Angular的优点,摒弃了他们的缺点。Vue的官网:https://cn.vuejs.org/v2/api/Vue诞生于2016年,是现在非常流行的MVVM框架。Vue提供了“引包”的使用方法,初学者可以在这之下学习语法。不需要webpack,不需…

Beats入门简介

使用Beat收集nginx日志和指标数据 项目需求 Nginx是一款非常优秀的web服务器,往往nginx服务会作为项目的访问入口,那么,nginx的性能保障就变得非常重要了,如果nginx的运行出现了问题就会对项目有较大的影响,所以&…

PHP-curl

//初始化$curl curl_init();//设置抓取的urlcurl_setopt($curl, CURLOPT_URL, http://www.baidu.com);//设置头文件的信息作为数据流输出curl_setopt($curl, CURLOPT_HEADER, 1);//设置获取的信息以文件流的形式返回,而不是直接输出。curl_setopt($curl, CURLOPT_R…

MPlayer开发

一、介绍 不论是音频数据还是视频数据,我都为MPlayer项目开发过一些开源的解码器。因此我个人认为我有资格写一篇文档来介绍如何开发新的编解码器。 学习如何添加一个新的编解码器的最好方法通常是学习大量的已有代码。本文档仅仅是对代码的一个补充&#x…

可编程led灯带原理_SCPSD-250-04-27派克真空压力传感器故障和工作原理

SCPSD-250-04-27派克PARKER真空压力传感器故障和工作原理PARKER压力开关现货 PARKER压力传感器特价 派克真空压力传感器 PARKER数字压力开关2020年还剩最后2天了,这一年大家都过得不太容易,尤其是我自己这是30年以来过得最艰难的一年,经…

总结面试时没有回答上的内存对齐问题

前两天面试某公司时,没有回答上的一个问题,总结如下,以供参考。 问:下面这个结构类型的实例变量占用多少内存: struct struct1 { int i; short j; char c; }; 我反问:是啥语言啥机器啥编译环境…

Kibana入门安装与介绍

Kibana入门 Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化…

友善串口工具接收数据随机换行_使用Python3+PyQT5+Pyserial 实现简单的串口工具方法...

练手项目,先上图先实现一个简单的串口工具,为之后的上位机做准备代码如下:pyserial_demo.pyimport sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtC…

Vue渲染函数

前面的话 Vue 推荐在绝大多数情况下使用 template 来创建HTML。然而在一些场景中,真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器。本文将详细介绍Vue渲染函数 引入 下面是一个例子,如果要…

数据绑定原理

一、数据单向绑定原理指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,最后把这段HTML代码插入到文档流里。缺点:一旦HTML代码生成就没有办法改变,如果有新数据重新传入,就必须重新把模板和…

视频解码优化

以下通过剖析一些经验来了解视频解码优化 1. 在嵌入式系统中实现MPEG4的视频解码 有两种方法可行 (1)采用ffmpeg(mplayer 的核心就是采用ffmpeg),然后对ffmpeg mp4解码优化 1).对IDCT汇编化,并优化VLD的实现 ->inline&汇编化 2).根据ARM9 cache&cache…

Logstash入门简介

Logstash入门简介 介绍 Logstash是一个开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到最喜欢的存储库中(我们的存储库当然是ElasticSearch) 我们回到我们ElasticStack的架构图&a…