网络应用开发学习简记(一)——Tcp协议通信服务器

    技术2024-07-12  67

        Mina是以Nio为基础,基于事件驱动的网络应用开发框架,是对NIO异步封装的实现,调用IO事件处理委托来响应接收器(IoAcceptor)中过滤器(过滤器链FilterChain)过滤得到的Io事件,一般步骤是:

      生成一个接收器(Acceptor)并设置好它的读写缓存大小以及空闲状态时间——>将过滤器添加到它的过滤器链中——>将事件处理对象(IoHandler)注册到接收器上——>绑定本机端口开始等待接收。

     mina tcp协议模式下的基本概念:

         1. IoProcessor:类似于Nio中的socketChannel,管理整个接收器上的过滤器,session。

         2. IoSession:一次连接成功即得到一个Iosession,它封装的是底层socket对象,用于双方通信。

         3. IoHandler:Io事件处理委托。IoAcceptor接收到的事件都由该对象响应处理,一般要实现IoHandler接口或者继承IoHandlerAdapter类。

    下面是一个简单的响应服务器程序(供参考):

          1.  建立服务器:

    package com; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; 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.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaServer { private int port; public MinaServer(int port) { this.port=port; } /** * 启动服务器 * @throws IOException */ public void start() throws IOException { IoAcceptor acceptor=new NioSocketAcceptor(); acceptor.getSessionConfig().setMaxReadBufferSize(1023); //设置接收缓存大小 acceptor.getSessionConfig().setMinReadBufferSize(1); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30); //添加解码器,设置编解码为UTF-8 acceptor.getFilterChain().addLast("decode", new ProtocolCodecFilter (new TextLineCodecFactory(Charset.forName("GBK")))); //设置委托处理类,服务器过滤到的各种事件均在委托类里处理。 acceptor.setHandler(new MsgHandler()); InetSocketAddress address=new InetSocketAddress(this.port); //绑定本地端口 acceptor.bind(address); System.out.println("server is ready!"); } } 

        2. 消息处理委托类:

     package com; import java.net.InetSocketAddress; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MsgHandler extends IoHandlerAdapter { /** * 连接上的客户端地址 */ private InetSocketAddress address; /** * 日志记录 */ private final static Logger loger=LoggerFactory.getLogger(MsgHandler.class); /** * 创建session */ @Override public void sessionCreated(IoSession session) throws Exception { loger.info("session connected"); } /** * 把建立起来的session开启,等待客户端信息 */ @Override public void sessionOpened(IoSession session) throws Exception { this.address=(InetSocketAddress)session.getRemoteAddress(); loger.info("remote user connected on is: "+this.address.toString()); } /** * 接收消息并在这里处理,包括回复应答 */ @Override public void messageReceived(IoSession session,Object message) throws Exception { String recMsg=(String)message; loger.info(this.address+" send<<<: "+recMsg); String msgBack="welcome for mina tcp test!"; session.write(msgBack); } /** * 捕捉异常并处理 */ @Override public void exceptionCaught(IoSession session,Throwable cause) throws Exception { loger.info("the exception occured is: "+cause.toString()); if(session !=null) { session.close(false); } } /** * 会话结束,关闭session。 */ @Override public void sessionClosed(IoSession session) throws Exception { session.close(true); } } 

        3. 入口函数:

        package com; public class Program { /** * @param args * 启动服务器,等待客户端连接建立…… */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub MinaServer server=new MinaServer(5000); server.start(); } }

     

     

    最新回复(0)