mina学习基础-入门实例-传输java对象(二)

来源:互联网 发布:域名主机查询 编辑:程序博客网 时间:2024/05/18 22:42
Apache的MINA(Multipurpose InfraStructure Networked Application)是一个网络应用框架,
它提供了一个抽象的,事件驱动的异步API,使Java NIO可以在各种传输协议(例如TCP协议和UDP协议)下高效开发.
其中无论是创建mina服务器还是客户端,最重要的三步都是:创建接收器/发送器,添加消息过滤器和添加业务处理器.
其中过滤器是mina的核心,mina提供了很多种过滤器,例如上篇笔记讲到了TextLineCodecFactory,此过滤器的意思是:
服务器收到客户端发送来的消息中只要以windows换行符(\r\n)结尾,服务器就认为是一个完整的消息,这种过滤器是
比较常用的,但是做为java,一门面向对象的变成语言来讲,mina除了提供TextLineCodecFactory顾虑器,还提供了
ObjectSerializationCodecFactory过滤器用来传输java对象.
1.开发公用core模块.
  创建名为mina-core的java项目,用来存放Model,这里的Model必须实现Serializable,因为mina传输java对象是通过

  序列化和反序列化实现的,直接看代码User.

package com.ilucky.mina.core.model;import java.io.Serializable;/** * @author IluckySi * @date 20140508 */public class User implements Serializable {private static final long serialVersionUID = 1L;private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String toString() {return "username="+username+",password="+password;}}

2.开发服务器,直接看代码MinaServer.

package com.ilucky.mina.server;import java.net.InetSocketAddress;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.serialization.ObjectSerializationCodecFactory;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 ObjectSerializationCodecFactory()));//设置读取数据的缓冲区大小.acceptor.getSessionConfig().setReadBufferSize(2048);//设置读写通道10秒内无操作进入空闲状态.acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 100);//添加业务处理器.acceptor.setHandler(new MinaServerIoHandler()); //为服务器绑定监听端口.acceptor.bind(new InetSocketAddress(PORT));System.out.println("服务端启动成功!");} catch (Exception e) {System.out.println("服务端启动异常!");}}}
package com.ilucky.mina.server;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;import com.ilucky.mina.core.model.User;/** * @author IluckySi * @date 20140507 */public class MinaServerIoHandler extends IoHandlerAdapter  { public void messageReceived(IoSession session, Object message) throws Exception {         User user = (User)message;         System.out.println("服务器收到客户端消息" + user);         session.write("success!");  }  public void messageSent(IoSession session, Object message) throws Exception { session.close(true); System.out.println("一次请求结束!"); }}

3.开发客户端,直接看代码MinaClient.

package com.ilucky.mina.client;import java.net.InetSocketAddress;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.serialization.ObjectSerializationCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketConnector;import com.ilucky.mina.core.model.User;/** * @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 ObjectSerializationCodecFactory()));//添加业务理器.connector.setHandler(new MinaClientHandler());IoSession session = null;try {//创建连接.ConnectFuture future = connector.connect(new InetSocketAddress(HOST, PORT));// 等待连接创建完成future.awaitUninterruptibly();session = future.getSession();User user = new User();user.setUsername("IluckySi");user.setPassword("123456");session.write(user);System.out.println("客户端向服务器发送消息" + user);;} catch (Exception e) {System.out.println("客户端发送消息失败!");}//等待连接断开, 即线程阻塞在这里, 一直等到服务器关闭此session后, 线程才会继续执行.session.getCloseFuture().awaitUninterruptibly();//释放资源.connector.dispose();}}
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);    }}

4.测试服务器和客户端.

  先启动服务器,再启动客户端,发现客户端成功发送消息,服务器成功接收消息,并成功写回消息给客户端.
 
0 0
原创粉丝点击