UDP Client 示例

前面我们讲了 UDP 服务器端示例,现在我们来看一下与之对应的客户端代码。

客户端的实现需要做的事情:

  • 创建套接字并连接到服务器端
  • 设置 IoHandler
  • 收集空闲内存
  • 发送数据到服务器端

现在我们看一下 org.apache.mina.example.udp.client 包中的 MemMonClient.java。前几行代码简单明了:

  1. connector = new NioDatagramConnector();
  2. connector.setHandler( this );
  3. ConnectFuture connFuture = connector.connect( new InetSocketAddress("localhost", MemoryMonitor.PORT ));

我们创建了一个 NioDatagramConnector,设置了处理器然后连接到服务器。我曾经落入的一个陷阱是,你必须在 InetSocketAddress 对象中设置主机,否则它将什么也不干。这个例子是在一台 Windows XP 主机上编写并测试,因此在其他环境中可能会有所不同。解析来我们将等待客户端连接到的主机的确认。一旦得知我们已经建立连接,我们就可以开始向服务器端写数据了:

  1. connFuture.addListener( new IoFutureListener(){
  2. public void operationComplete(IoFuture future) {
  3. ConnectFuture connFuture = (ConnectFuture)future;
  4. if( connFuture.isConnected() ){
  5. session = future.getSession();
  6. try {
  7. sendData();
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. } else {
  12. log.error("Not connected...exiting");
  13. }
  14. }
  15. });

这里我们为 ConnectFuture 对象添加了一个监听者,当我们接收到客户端已建立连接的回调时,我们就可以写数据了。向服务器端写数据将会由一个叫做 sendData 的方法处理。这个方法如下所示:

  1. private void sendData() throws InterruptedException {
  2. for (int i = 0; i < 30; i++) {
  3. long free = Runtime.getRuntime().freeMemory();
  4. IoBuffer buffer = IoBuffer.allocate(8);
  5. buffer.putLong(free);
  6. buffer.flip();
  7. session.write(buffer);
  8. try {
  9. Thread.sleep(1000);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. throw new InterruptedException(e.getMessage());
  13. }
  14. }
  15. }

这个方法将在 30 秒之内的每秒钟向服务器端发送一次空闲内存的数量。在这里你可以看到我们分配了一个足够大的 IoBuffer 来保存一个 long 类型变量,然后将空闲内存的数量放进缓存。缓冲随即写给服务器端。

UDP Client 实现完成。