mina学习基础-入门实例-传输以回车做为结尾的字符串(一)
来源:互联网 发布:乐视为什么倒闭 知乎 编辑:程序博客网 时间:2024/05/22 03:03
Apache的MINA(Multipurpose InfraStructure Networked Application)是一个网络应用框架,
它提供了一个抽象的,事件驱动的异步API,使Java NIO可以在各种传输协议(例如TCP和UDP协议)下高效开发.
下面通过一个简单的实例学习一下如何使用mina开发服务器端和客户端.
1.开发服务器端.
a.创建名为mina-server的web项目,引入必须的jar包.
过滤器使用mina自带的TextLineCodec过滤器,该过滤器指定参数为windows的换行符,即服务器收到客户端发送来的消息中只要有
windows换行符(\r\n),服务器就认为是一个完整消息,而服务器发送给客户端的消息都会默认在消息末尾添加(\r\n)文本换行符.
自定义的业务处理器继承了IoHandlerAdapter类,覆盖了父类的7个方法,其中最重要的一个方法是messageReceived方法.
通过在cmd窗口执行telent 127.0.0.1 4000连接服务器,然后输入测试消息test,回车便会在服务器后台打印出接收到的消息,同时客户端也
会接收到服务器写回的消息.
3.开发客户端.
a.创建名为mina-client的web项目,引入必须的jar包.
过滤器使用mina自带的TextLineCodec过滤器,该过滤器指定参数为windows的换行符,即服务器收到客户端发送来的消息中只要有windows
换行符(\r\n),服务器就认为是一个完整消息,而服务器发送给客户端的消息都会默认在消息末尾添加(\r\n)文本换行符.
自定义的业务处理器继承了IoHandlerAdapter类,覆盖了父类的7个方法,其中最重要的一个方法是messageReceived方法.
先启动服务器端,再启动客户单,客户端成功发送消息,服务器端成功接收消息,并成功写回消息.
5.长连接和短连接.
成功启动服务器端和客户端完成测试后,打开windows的任务管理器,发现当前操作系统中启动了3个java进程(注意其中一个进程是myEclipse的),
java应用程序的入口是main()方法,启动一个main()方法相当于运行一个Java虚拟机,操作系统中也会相应启动一个进程,
因此在任务管理器中有三个进程,一个是mina-server的,一个是mina-client的,一个是myeclipse的,这里的进程是长连接,即如果不手动停止
会一直存在,长连接的现象在网络中非常普遍,例如qq,登录成功后qq客户端与qq服务器建立的就是长连接,除非主动关闭qq客户端,或是
qq服务器挂了.与长连接相对应的是短连接,比如常见的请求/响应模式,例如HTTP协议,客户端向服务器发送一个请求,建立连接后,
服务端处理并响应成功,此时就主动断开连接了.短连接是一个简单而有效的处理方式,也是应用最广的.Mina是Java NIO实现的应用框架,
更倾向于短连接的服务.mina-server的业务逻辑器中有一个方法messageSent,即服务器写回给客户端后调用此方法,此时关闭session,
直接看代码MinaServerIoHandler.
它提供了一个抽象的,事件驱动的异步API,使Java NIO可以在各种传输协议(例如TCP和UDP协议)下高效开发.
下面通过一个简单的实例学习一下如何使用mina开发服务器端和客户端.
1.开发服务器端.
a.创建名为mina-server的web项目,引入必须的jar包.
b.创建服务器端,直接看代码MinaServer.java,
package com.ilucky.mina.server;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.LineDelimiter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;/** * @author IluckySi * @date 20140507 */public class MinaServer {private static int PORT = 4000;public static void main(String[] args) {//创建接收器.IoAcceptor acceptor = new NioSocketAcceptor();try {//添加过滤器.acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));//设置读取数据的缓冲区大小.acceptor.getSessionConfig().setReadBufferSize(2048);//设置读写通道10秒内无操作进入空闲状态.acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);//添加业务处理器.acceptor.setHandler(new MinaServerIoHandler()); //为服务器绑定监听端口.acceptor.bind(new InetSocketAddress(PORT));System.out.println("服务端启动成功!");} catch (Exception e) {System.out.println("服务端启动异常!");}}}
创建MinaServer服务器最重要的三步:创建接收器-添加消息过滤器-添加业务处理器.
接收器使用NioSocketAcceptor,这是一个非阻塞的socket连接,过滤器使用mina自带的TextLineCodec过滤器,该过滤器指定参数为windows的换行符,即服务器收到客户端发送来的消息中只要有
windows换行符(\r\n),服务器就认为是一个完整消息,而服务器发送给客户端的消息都会默认在消息末尾添加(\r\n)文本换行符.
自定义的业务处理器继承了IoHandlerAdapter类,覆盖了父类的7个方法,其中最重要的一个方法是messageReceived方法.
直接看代码MinaServerIoHandler,
package com.ilucky.mina.server;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;/** * @author IluckySi * @date 20140507 */public class MinaServerIoHandler extends IoHandlerAdapter { public void messageReceived(IoSession session, Object message) throws Exception { String msg = message.toString(); System.out.println("服务器收到客户端消息" + msg); session.write("success!"); }}
messageReceived方法用来接收客户端发送过来的消息,并通过seesion写回给客户端.
2.测试服务器端.通过在cmd窗口执行telent 127.0.0.1 4000连接服务器,然后输入测试消息test,回车便会在服务器后台打印出接收到的消息,同时客户端也
会接收到服务器写回的消息.
3.开发客户端.
a.创建名为mina-client的web项目,引入必须的jar包.
b.创建客户端,直接看代码MinaClient.java,
package com.ilucky.mina.client;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.service.IoConnector;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.LineDelimiter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketConnector;/** * @author IluckySi * @date 20140507 */public class MinaClient { public static final String HOST = "127.0.0.1"; public static final int PORT = 4000; public static void main(String[] args) { //创建连接器. IoConnector connector = new NioSocketConnector(); //设置超时时间. connector.setConnectTimeoutMillis(30000); //添加消息过滤器 connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); //添加业务理器. connector.setHandler(new MinaClientHandler()); IoSession session = null; try { //创建连接. ConnectFuture future = connector.connect(new InetSocketAddress(HOST, PORT)); // 等待连接创建完成 future.awaitUninterruptibly(); session = future.getSession(); String msg = "Hello, mina-server!"; session.write(msg); System.out.println("客户端向服务器发送消息" + msg);; } catch (Exception e) { System.out.println("客户端发送消息失败!"); } //等待连接断开, 即线程阻塞在这里, 一直等到服务器关闭此session后, 线程才会继续执行. session.getCloseFuture().awaitUninterruptibly(); //释放资源. connector.dispose(); }}
创建MinaClient服务器最重要的三步:创建连接器-添加消息过滤器-添加业务处理器.
连接器使用NioSocketConnector,这是一个非阻塞的socket连接,过滤器使用mina自带的TextLineCodec过滤器,该过滤器指定参数为windows的换行符,即服务器收到客户端发送来的消息中只要有windows
换行符(\r\n),服务器就认为是一个完整消息,而服务器发送给客户端的消息都会默认在消息末尾添加(\r\n)文本换行符.
自定义的业务处理器继承了IoHandlerAdapter类,覆盖了父类的7个方法,其中最重要的一个方法是messageReceived方法.
直接看代码MinaClientIoHandler,
package com.ilucky.mina.client;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;/** * @author IluckySi * @date 20140507 */public class MinaClientHandler extends IoHandlerAdapter { public void messageReceived(IoSession session, Object message) throws Exception { String msg = message.toString(); System.out.println("客户端收到服务器返回的消息" + msg); }}
messageReceived方法用来接收服务器写回的消息.
4.测试客户端.先启动服务器端,再启动客户单,客户端成功发送消息,服务器端成功接收消息,并成功写回消息.
5.长连接和短连接.
成功启动服务器端和客户端完成测试后,打开windows的任务管理器,发现当前操作系统中启动了3个java进程(注意其中一个进程是myEclipse的),
java应用程序的入口是main()方法,启动一个main()方法相当于运行一个Java虚拟机,操作系统中也会相应启动一个进程,
因此在任务管理器中有三个进程,一个是mina-server的,一个是mina-client的,一个是myeclipse的,这里的进程是长连接,即如果不手动停止
会一直存在,长连接的现象在网络中非常普遍,例如qq,登录成功后qq客户端与qq服务器建立的就是长连接,除非主动关闭qq客户端,或是
qq服务器挂了.与长连接相对应的是短连接,比如常见的请求/响应模式,例如HTTP协议,客户端向服务器发送一个请求,建立连接后,
服务端处理并响应成功,此时就主动断开连接了.短连接是一个简单而有效的处理方式,也是应用最广的.Mina是Java NIO实现的应用框架,
更倾向于短连接的服务.mina-server的业务逻辑器中有一个方法messageSent,即服务器写回给客户端后调用此方法,此时关闭session,
直接看代码MinaServerIoHandler.
package com.ilucky.mina.server;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;/** * @author IluckySi * @date 20140507 */public class MinaServerIoHandler extends IoHandlerAdapter { public void messageReceived(IoSession session, Object message) throws Exception { String msg = message.toString(); System.out.println("服务器收到客户端消息" + msg); session.write("success!"); } public void messageSent(IoSession session, Object message) throws Exception { session.close(true); System.out.println("一次请求结束!"); }}
0 0
- mina学习基础-入门实例-传输以回车做为结尾的字符串(一)
- mina学习基础-入门实例-传输java对象(二)
- mina学习基础-入门实例-传输定长报文(三)
- MINA 基础学习一
- Mina入门实例(一)
- Oracle sqlldr导入以回车和回车换行字符结尾的文本
- [一]Mina入门实例-Mina网络通信框架
- Mina的入门(一)
- 判断字符串是否以指定的字符串结尾
- 检查一个字符串是否以指定的字符串结尾
- 检查一个字符串是否以指定的字符串结尾
- C 的 "%s"对应以'\0'结尾的字符串
- C 的 "%s"对应以'\0'结尾的字符串
- 关于string类型的字符串是否以\0结尾
- 关于string类型的字符串是否以\0结尾
- 关于string类型的字符串是否以\0结尾
- 关于string类型的字符串是否以\0结尾
- 判断是否以指定的字符串开头或结尾
- 硬盘安装openSUSE全过程(亲测)
- JAVA IO流详解
- java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux
- redmine访问速度慢的处理方法
- java--根据URL获取信息
- mina学习基础-入门实例-传输以回车做为结尾的字符串(一)
- ffmpeg编译生成ffplay
- c++队列
- PHP面向对象基础
- java集合类总结
- Tornado编译vxworks.bin镜像
- 【垃圾菜鸟笔记】ajax +用户注册小小实例
- Linux中cp和scp命令的使用
- Discuz!X3 修改在线人数在线会员以及统计数据的方法