MINA客户端与服务端通信实例

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便

apache mina

利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。

 

需要导入的包:

log4j.jar

mina-core-2.0.4.jar 

slf4j-api-1.6.3.jar 

slf4j-log4j12-1.6.3.jar

 

服务端代码:

 

Java代码   收藏代码
  1. /** 
  2.  * @author aniyo 
  3.  * blog: http://aniyo.iteye.com 
  4.  */  
  5. public class MinaTimeServer {  
  6.                 // 服务器监听端口  
  7.     private static final int PORT = 8888;  
  8.       
  9.     /** 
  10.      *  
  11.      */  
  12.     public MinaTimeServer() {  
  13.         // TODO Auto-generated constructor stub  
  14.     }  
  15.   
  16.     /** 
  17.      * @param args 
  18.      */  
  19.     public static void main(String[] args) {  
  20.         // 服务器端的主要对象  
  21.         IoAcceptor acceptor = new NioSocketAcceptor();  
  22.           
  23.         // 设置Filter链   
  24.         acceptor.getFilterChain().addLast("logger"new LoggingFilter());  
  25.         // 协议解析,采用mina现成的UTF-8字符串处理方式  
  26.         acceptor.getFilterChain().addLast("codec"new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));  
  27.           
  28.         // 设置消息处理类(创建、关闭Session,可读可写等等,继承自接口IoHandler)  
  29.         acceptor.setHandler(new TimeServerHandler() );  
  30.         // 设置接收缓存区大小  
  31.         acceptor.getSessionConfig().setReadBufferSize(2048);  
  32.         acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);  
  33.         try {  
  34.             // 服务器开始监听  
  35.             acceptor.bind( new InetSocketAddress(PORT) );  
  36.         }catch(Exception e){  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  
  40.   
  41. }  

 

 

服务端业务处理类:

Java代码   收藏代码
  1. package aniyo.mina.server;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.apache.mina.core.service.IoHandlerAdapter;  
  6. import org.apache.mina.core.session.IoSession;  
  7.   
  8. /** 
  9.  * @author aniyo 
  10.  * blog: http://aniyo.iteye.com 
  11.  * 继承自IoHandlerAdapter,IoHandlerAdapter继承接口 IoHandler 
  12.         类IoHandlerAdapter实现了IoHandler的所有方法,只要重载关心的几个方法就可以了 
  13.  */  
  14. public class TimeServerHandler extends IoHandlerAdapter {  
  15.   
  16.     @Override  
  17.     public void exceptionCaught(IoSession session, Throwable cause)  
  18.             throws Exception {  
  19.         cause.printStackTrace();  
  20.     }  
  21.   
  22.     /* 
  23.      * 这个方法是目前这个类里最主要的, 
  24.      * 当接收到消息,只要不是quit,就把服务器当前的时间返回给客户端 
  25.      * 如果是quit,则关闭客户端连接*/  
  26.     @Override  
  27.     public void messageReceived(IoSession session, Object message)  
  28.             throws Exception {  
  29.         String str = message.toString();  
  30.         if (str.trim().equalsIgnoreCase("quit")) {  
  31.             session.close();  
  32.             return;  
  33.         }  
  34.         Date date = new Date();  
  35.         System.out.println("hello"+str+session.getRemoteAddress()+date.toString());  
  36.           
  37.         session.write("i am recived");  
  38.         System.out.println("Message written...");  
  39.   
  40.     }  
  41.       
  42.     @Override  
  43.     public void sessionClosed(IoSession session) throws Exception {  
  44.         // TODO Auto-generated method stub  
  45.         super.sessionClosed(session);  
  46.         System.out.println("客户端与服务端断开连接.....");  
  47.     }  
  48.   
  49. }  

 

 

客户端:

Java代码   收藏代码
  1. package aniyo.mina.server;  
  2. import java.net.InetSocketAddress;     
  3.     
  4. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;     
  5. import org.apache.mina.core.future.ConnectFuture;     
  6. import org.apache.mina.filter.codec.ProtocolCodecFilter;     
  7. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;     
  8. import org.apache.mina.transport.socket.nio.NioSocketConnector;     
  9.     
  10. /**   
  11.  * mina客户端   
  12.  * @author aniyo    
  13.  * blog:http://aniyo.iteye.com 
  14.  */    
  15. public class MinaClient {     
  16.     
  17.     public static void main(String []args)throws Exception{     
  18.              
  19.         //Create TCP/IP connection     
  20.         NioSocketConnector connector = new NioSocketConnector();     
  21.              
  22.         //创建接受数据的过滤器     
  23.         DefaultIoFilterChainBuilder chain = connector.getFilterChain();     
  24.              
  25.         //设定这个过滤器将一行一行(/r/n)的读取数据     
  26.         chain.addLast("myChin"new ProtocolCodecFilter(new TextLineCodecFactory()));     
  27.              
  28.         //客户端的消息处理器:一个SamplMinaServerHander对象     
  29.         connector.setHandler(new MinaClientHandler());     
  30.              
  31.         //set connect timeout     
  32.         connector.setConnectTimeout(30);     
  33.              
  34.         //连接到服务器:     
  35.         ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",8888));     
  36.              
  37.         //Wait for the connection attempt to be finished.     
  38.         cf.awaitUninterruptibly();     
  39.              
  40.         cf.getSession().getCloseFuture().awaitUninterruptibly();     
  41.              
  42.         connector.dispose();     
  43.     }    
  44. }  

 

客户端业务逻辑处理类:

Java代码   收藏代码
  1. package aniyo.mina.server;  
  2.   
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IoSession;  
  5.   
  6. /** 
  7.  * 客户端业务处理逻辑 
  8.  *  
  9.  * @author aniyo blog: http://aniyo.iteye.com 
  10.  */  
  11. public class MinaClientHandler extends IoHandlerAdapter {  
  12.     // 当客户端连接进入时  
  13.     @Override  
  14.     public void sessionOpened(IoSession session) throws Exception {  
  15.         System.out.println("incomming 客户端: " + session.getRemoteAddress());  
  16.         session.write("i am coming");  
  17.     }  
  18.   
  19.     @Override  
  20.     public void exceptionCaught(IoSession session, Throwable cause)  
  21.             throws Exception {  
  22.         System.out.println("客户端发送信息异常....");  
  23.     }  
  24.   
  25.     // 当客户端发送消息到达时  
  26.     @Override  
  27.     public void messageReceived(IoSession session, Object message)  
  28.             throws Exception {  
  29.   
  30.         System.out.println("服务器返回的数据:" + message.toString());  
  31.     }  
  32.   
  33.     @Override  
  34.     public void sessionClosed(IoSession session) throws Exception {  
  35.         System.out.println("客户端与服务端断开连接.....");  
  36.     }  
  37.   
  38.     @Override  
  39.     public void sessionCreated(IoSession session) throws Exception {  
  40.         // TODO Auto-generated method stub  
  41.         System.out  
  42.                 .println("one Client Connection" + session.getRemoteAddress());  
  43.         session.write("我来了······");  
  44.     }  
  45.   
  46. }  

 

先启动服务器,再启动客户端,就ok了 

不写客户端也可用

在运行里输入cmd-->telnet localhost 8888  就可以了


解析http请求时报如下错误:
java.nio.charset.MalformedInputException: Input length = 1
        at java.nio.charset.CoderResult.throwException(Unknown Source) [na:1.6.0_17]
        at org.apache.mina.core.buffer.AbstractIoBuffer.getString(AbstractIoBuffer.java:1442) [comet-server.jar:na]
API 中的说明是当输入字节序列对于给定 charset 来说是不合法的,或者输入字符序列不是合法的 16 位 Unicode 序列时,抛出此经过检查的异常。


------解决方法如下

  1. //创建接受数据的过滤器  
  2.         DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
  3.   
  4.         //设定这个过滤器将一行一行(/r/n)的读取数据  
  5.         //chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));//这个是传递字符串用的解码器,屏蔽掉  
  6.         chain.addLast("codec"new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));//这个才是mina传递对象的解码器  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值