一、前言
基于mina框架依赖库及版本包(apache-mina-2.0.4-bin.zip及更多版本,依赖库lib目录,版本包dist目录)实现客户服务端即时消息通信聊天,代码示例定义服务端入口启动MinaMessageServer类(创建通信socket套接字)、消息会话内容处理SessionMessageHandler类(实现消息会话处理逻辑)。
二、代码说明
1. MinaMessageServer类 - 启动main入口方法
package mina;@b@@b@import java.io.IOException;@b@import java.net.InetSocketAddress;@b@@b@import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;@b@import org.apache.mina.core.service.IoAcceptor;@b@import org.apache.mina.filter.codec.ProtocolCodecFilter;@b@import org.apache.mina.filter.codec.textline.TextLineCodecFactory;@b@import org.apache.mina.transport.socket.nio.NioSocketAcceptor;@b@@b@public class MinaMessageServer {@b@ @b@ private static final int PORT = 9999;// 定义监听端口@b@@b@ public static void main(String[] args) throws IOException {@b@ @b@ // 创建一个非阻塞的Server端socket,用NIO@b@ IoAcceptor acceptor = new NioSocketAcceptor();@b@ @b@ // 创建接受数据的过滤器@b@ DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();@b@ @b@ // 设定这个过滤器将一行一行的读取数据@b@ chain.addLast("codec", new ProtocolCodecFilter(@b@ new TextLineCodecFactory()));// 指定编码过滤器@b@ @b@ // 指定业务逻辑处理器@b@ acceptor.setHandler(new SessionMessageHandler());@b@ @b@ // 设置端口号@b@ acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));@b@ acceptor.bind(); // 启动监听@b@ @b@ System.out.println("Mina Server消息服务已启动,监听端口:" + PORT);@b@ }@b@ @b@}
2. SessionMessageHandler类 - 消息会话处理
package mina;@b@@b@import java.text.SimpleDateFormat;@b@import java.util.Date;@b@@b@import org.apache.mina.core.service.IoHandlerAdapter;@b@import org.apache.mina.core.session.IoSession;@b@@b@public class SessionMessageHandler extends IoHandlerAdapter {@b@ @b@ // 当一个客户端连接进入时@b@ @Override@b@ public void sessionOpened(IoSession session) throws Exception {@b@ System.out.println("client【"+session.getId()+"】 接入会话,IP:" + session.getRemoteAddress());@b@ }@b@@b@ // 当客户端发送消息到达时@b@ @Override@b@ public void messageReceived(IoSession session, Object message)@b@ throws Exception {@b@ String clientMessage = message.toString();@b@ System.out.println("收到client【"+session.getId()+"】发来的消息:" + clientMessage);@b@ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd mm:hh:ss");@b@ @b@ session.write(sdf.format( new Date())+"已经收到您的消息!");// 返回当前时间的字符串@b@ System.out.println("已给client【"+session.getId()+"】回复消息");@b@ }@b@@b@ // 当一个客户端连接关闭时@b@ @Override@b@ public void sessionClosed(IoSession session) throws Exception {@b@ System.out.println("client【"+session.getId()+"】 结束会话");@b@ }@b@}
3. 启动测试通信,首先启动MinaMessageServer类, 后台打印启动日志
Mina Server消息服务已启动,监听端口:9999
客户端通过telnet命令模拟给服务端发送消息,操作如下
客户端窗口发送消息(“who?”、“hello”),服务端自动回复“已经收到您的消息!”