MINA2.0用户手册中文版--第二章 第四节 UDP服务端实例

(补充:由于该手册官方也在不断完善中,因此会有变化,最近一次更新时间为2012-12-08,强烈建议看原文)

这一次,我们将以 org.apache.mina.example.udp包中的代码作为开始,为了保持简单,我们将只关注和MINA相关的部分。

要构建一个UDP服务,我们要完成以下两点:
1. 创建一个数据报Datagram Socket用来监听传入的客户端请求(参看包中的代码MemoryMonitor.java)
2. 创建一个IOHandler用来处理MINA框架生成的事件(参看包中代码MemoryMonitorHandler.java)

下面是第一点中代码(MemoryMonitor.java)的片段:
NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
acceptor.setHandler(new MemoryMonitorHandler(this));

这里,我们创建了一个NIO的数据报接收器NioDatagramAcceptor对象,用来传入的客户端请求,然后通过setHandler设置了处理者。下一步是向这个接收器的过滤器链中添加日志过滤器,日志过滤器可以用来很好的观察MINA的运行过程;通过生成不同层面的日志,提供一个深入了解MINA运作机制的方法。

DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("logger", new LoggingFilter());

接下来,我们来看一些和UDP传输相关的特定代码,这里设置了接收器重用地址,最后要做的就是绑定到一个端口——其中端口PORT是一个int类型的变量:

DatagramSessionConfig dcfg = acceptor.getSessionConfig();
dcfg.setReuseAddress(true);acceptor.bind(new InetSocketAddress(PORT));

接下来看“IoHandler实现”:

UPD服务器的实现有三个是最需要关注的事件方法:

  • Session创建
  • 消息接收
  • Session关闭

接下来详细看一下每一步的具体实现:

Session创建事件:

@Override
public void sessionCreated(IoSession session) throws Exception {
    SocketAddress remoteAddress = session.getRemoteAddress();
    server.addClient(remoteAddress);
}

代码中只是调用了addClient()方法,该操作只是在服务器的UI界面添加了一个代表客户端Tab标签页。

消息接收事件:

@Override
public void messageReceived(IoSession session, Object message) throws Exception {
    if (message instanceof IoBuffer) {
        IoBuffer buffer = (IoBuffer) message;
        SocketAddress remoteAddress = session.getRemoteAddress();
        server.recvUpdate(remoteAddress, buffer.getLong());
    }
 }

该事件中,主要是将接收到的消息数据进行转储,另外提供响应处理。该方法主要完成了对消息进行处理,并将响应写入到session返回给客户端。

Session关闭事件:

@Override
public void sessionClosed(IoSession session) throws Exception {
    System.out.println("Session closed...");
    SocketAddress remoteAddress = session.getRemoteAddress();
    server.removeClient(remoteAddress);
}

关闭事件只是将代表客户端连接的Tab标签页从服务器的UI界面中移除。

你可能感兴趣的:(MINA2.0用户手册中文版--第二章 第四节 UDP服务端实例)