MINA框架编写一个通信系统

该博客详细介绍了如何利用MINA框架搭建一个简单的TCP通信系统,包括服务器端和客户端的实现。服务器端通过NioSocketAcceptor接收客户端请求,设置过滤器和逻辑处理类TimeServerHandler响应数据。客户端则通过NioSocketConnector连接服务器,并设置编码解码过滤器。通信过程中,实现了数据的接收、发送及异常处理。
摘要由CSDN通过智能技术生成
完成的目标:服务器接受到客户端的信息后作出一个反应(发送一条信息),客户端获得这条信息(同一个客户端可以不停的发送数据请求)。
上午的目标竟然在下午才能够完成:
先来看看我们的服务器端(server):
//代码其实很简单,但是我们一定要弄懂原理(越简单的代码我们要越小心)
public class MinaTimeServer
{
    private static final int PORT = 9123;

    public static void main( String[] args ) throws IOException
    {
        IoAcceptor acceptor = new NioSocketAcceptor();//new 一个TCP传输的Acceptor(相当于SeverSocket)
        //filter非常重要,且在server和client两边我们都要设定正确了,否则,MINA就他妈的是一个傻子(不给开发者任何消息),还有MINA这种公用框架尽然要log4j。
       //一个单用型公用包不应该有log日志打印系统的,所有的公用包的信息都要用exception抛出才对
        acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
        acceptor.getFilterChain().addLast( "codec",
          new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));//要特别的注意了,这个设定一定要和client端的相对应。

        acceptor.setHandler( new TimeServerHandler() );//设定用户逻辑处理类
        acceptor.getSessionConfig().setReadBufferSize( 2048 );//设定读取数据容器大小
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
        acceptor.bind( new InetSocketAddress(PORT) );
    }
}

当然了,这段代码是抄袭过来的。刚开始还挺佩服写这个博客的人,后来在MINA官网上发现了这段代码,瞬间我就有一种莫名的奇怪感遍布全身。
有了上面的启动代码后,我们还需要一个非常重要的逻辑处理类:
public class TimeServerHandler extends IoHandlerAdapter
{
    @Override
    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
    {
        cause.printStackTrace();
    }

    @Override
    public void messageReceived( IoSession session, Object message ) throws Exception
    {//接受数据的地方
        String str = message.toString();
        if( str.trim().equalsIgnoreCase("quit") ) {
            session.close();
            return;
        }
        Date date = new Date();
        System.out.println(date.toString());
        session.write( date.toString() );//此方法会触发下面的messageSent方法
        System.out.println("Message written...");
        System.out.println("Message is: "+str);
    }

    @Override
    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
    {
        System.out.println( "IDLE " + session.getIdleCount( status ));
    }

 @Override 
 public void messageSent(IoSession session, Object message) throws Exception { 
//发送数据的地方
  System.out.println("message sent: "+message.toString()); 
  super.messageSent(session, message);
     }
}

恩,上面就完成了一个Sever端的服务提供方了。下面我们来构造我们自己的client端:
public class Client {

         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" ))));
  ClientHandler ch = new ClientHandler("nihao");
  connector.setHandler(ch);
  connector.getSessionConfig().setReadBufferSize(1024);
  connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 100);
  connector.getSessionConfig().setUseReadOperation(true);
  ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9123));
  cf.awaitUninterruptibly();
  IoSession is = cf.getSession();
  System.out.println("connected is over!");
// while(true){
// is.write(""+Math.random());//触发我们的messageSent方法嘞
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
 }
}

//处理消息的地方
class ClientHandler extends IoHandlerAdapter {
 private String values;

 public ClientHandler(String values) {
  this.values = values;
 }

 public void setValues(String values){
  this.values = values;
 }
 
 @Override
 public void sessionOpened(IoSession session) {
  System.out.println("session write");
  session.write(values);
 }

 @Override
 public void messageReceived(IoSession session, Object message)
   throws Exception {
  System.out.println("message received");
  System.out.println(message);
 }

 @Override
 public void messageSent(IoSession session, Object message) throws Exception {
  System.out.println("message sent");
  super.messageSent(session, message);
 }
}

完成一个程序的编写之后,我们会对框架有一个概要的了解了。那么下面就是真正的去研究一下架构的问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值