这一次,我们将以 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界面中移除。