Mina入门

本文详细介绍使用Mina框架搭建网络通信的过程,包括服务器端和客户端的配置与交互。通过实例演示了如何设置编码过滤器、调整会话配置以及处理各种会话事件,如消息接收、发送和会话关闭等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.mina;

 

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;

import org.apache.mina.core.service.IoHandler;

import org.apache.mina.core.session.IdleStatus;

import org.apache.mina.core.session.IoSessionConfig;

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;

 

public class MinaServer {

    

     static int PORT = 7080;

    

     static IoAcceptor accept = null;

    

     public static void main(String[] args) throws Exception {

         accept = new NioSocketAcceptor();

        

         /*Charset charSet = Charset.forName("UTF-8");

         String encodingDelimiter  = LineDelimiter.WINDOWS.getValue();

         String decodingDelimiter = LineDelimiter.WINDOWS.getValue();

         ProtocolCodecFactory codecFactory =  new TextLineCodecFactory(charSet, encodingDelimiter, decodingDelimiter);

         IoFilter codecFilter = new ProtocolCodecFilter(codecFactory);

         accept.getFilterChain().addLast("codec", codecFilter);*/

         //设置编码过滤器

         accept.getFilterChain().addLast("codec", new ProtocolCodecFilter(

                      new TextLineCodecFactory(

                            Charset.forName("UTF-8"),

                            LineDelimiter.WINDOWS.getValue(),

                            LineDelimiter.WINDOWS.getValue()

                       )

                   )

              );

         IoSessionConfig sessionConfig = accept.getSessionConfig();

         //设置读缓冲区的大小

         sessionConfig.setReadBufferSize(1024);

         sessionConfig.setIdleTime(IdleStatus.BOTH_IDLE, 10);

         IoHandler myHandler = new MyServerHandler();

         accept.setHandler(myHandler);

         accept.bind(new InetSocketAddress(PORT));

         System.out.println("Server->" + PORT);

     }

 

}

package com.mina;

 

import java.text.SimpleDateFormat;

import java.util.Date;

 

import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IdleStatus;

import org.apache.mina.core.session.IoSession;

 

public class MyServerHandler extends IoHandlerAdapter {

    

     private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

 

     @Override

     public void exceptionCaught(IoSession session, Throwable cause) throws Exception {

         System.out.println("exceptionCaught()");

     }

 

     @Override

     public void inputClosed(IoSession session) throws Exception {

         System.out.println("inputClosed()");

     }

 

     @Override

     public void messageReceived(IoSession session, Object message) throws Exception {

         String msg = (String)message;

         Date d = new Date();

         String dateStr = sdf.format(d);

         System.out.println(dateStr + "服务器接受到数据:" + msg);

         if(msg.equals("exit")) {

              session.closeNow();

         }else {

              session.write(dateStr);

          }

        

     }

 

     @Override

     public void messageSent(IoSession session, Object message) throws Exception {

         System.out.println("messageSent()");

     }

 

     @Override

     public void sessionClosed(IoSession session) throws Exception {

         System.out.println("sessionClosed()");

     }

 

     @Override

     public void sessionCreated(IoSession session) throws Exception {

         System.out.println("sessionCreated()");

     }

 

     @Override

     public void sessionIdle(IoSession session, IdleStatus status) throws Exception {

         System.out.println("sessionIdle()");

     }

 

     @Override

     public void sessionOpened(IoSession session) throws Exception {

         System.out.println("sessionOpened()");

     }

 

 

}

Server->7080

sessionCreated()

sessionOpened()

sessionIdle()

log4j:WARN No appenders could be found for logger (org.apache.mina.filter.codec.ProtocolCodecFilter).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

2018-11-26 21:21:22服务器接受到数据:hello

messageSent()

2018-11-26 21:21:25服务器接受到数据:world

messageSent()

2018-11-26 21:21:30服务器接受到数据:exit

sessionClosed()

 

客户端操作

 

 

package com.mina;

 

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.service.IoHandler;

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;

 

public class MinaClient {

    

     private static String HOST="localhost";

    

     private static int PORT = 7080;

    

     public static void main(String[] args) {

         IoSession session = null;

         IoConnector connector = new NioSocketConnector();

         connector.setConnectTimeoutMillis(3000);

         //设置过滤器

         connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(

                      new TextLineCodecFactory(

                            Charset.forName("UTF-8"),

                            LineDelimiter.WINDOWS.getValue(),

                            LineDelimiter.WINDOWS.getValue()

                       )

                   )

              );

         IoHandler myHandler = new MyClientHandler();

         connector.setHandler(myHandler);

         ConnectFuture future = connector.connect(new InetSocketAddress(HOST, PORT));

         future.awaitUninterruptibly();

         session = future.getSession();

         session.write("你好,张飞");

         session.getCloseFuture().awaitUninterruptibly();//等待关闭连接

         connector.dispose();

     }

 

}

package com.mina;

 

import java.text.SimpleDateFormat;

import java.util.Date;

import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IoSession;

 

public class MyClientHandler extends IoHandlerAdapter  {

     private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

     @Override

     public void exceptionCaught(IoSession session, Throwable cause) throws Exception {

         System.out.println("exceptionCaught()");

     }

    

     @Override

     public void messageReceived(IoSession session, Object message) throws Exception {

         String msg = (String)message;

         Date d = new Date();

         String dateStr = sdf.format(d);

         System.out.println(dateStr + "客户端收到服务器发送回来的数据:" + msg);

     }

 

}

 

服务器

Server->7080

sessionCreated()

sessionOpened()

log4j:WARN No appenders could be found for logger (org.apache.mina.filter.codec.ProtocolCodecFilter).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

2018-11-26 22:31:03服务器接受到数据:你好,张飞

messageSent()

sessionIdle()

sessionIdle()

sessionIdle()

 

客户端

log4j:WARN No appenders could be found for logger (org.apache.mina.filter.codec.ProtocolCodecFilter).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

2018-11-26 22:31:03客户端收到服务器发送回来的数据:2018-11-26 22:31:03

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值