这一节我们将看一下上一节中提到的UDP服务器的客户端代码:
实现一个客户端需要做如下:
- 创建一个Socket并连接到服务器
- 设置操作处理器IoHandler
- 收集可用内存
- 发送数据到服务器
我们来看下包
org.apache.mina.example.udp.client中的代码MemMonClient.java,前面几行代码很简洁:
connector = new NioDatagramConnector(); connector.setHandler( this ); ConnectFuture connFuture = connector.connect( new InetSocketAddress("localhost", MemoryMonitor.PORT ));
这里创建了一个连接器NioDatagramConnector,设置了处理程序,并且连接到了指定的服务器。这里有个小问题,就是你必须设置对象InetSocketAddress中的主机地址,否则似乎无法正常工作。这个例子主要是在Windows XP上编写和测试的,在其他系统上可能会有所不同。接下来,我们就等待确认客户端已连接到了服务器上,一旦确认连接成功,我们就可以向服务器传送数据了,下面就是写数据的代码了:
connFuture.addListener( new IoFutureListener(){ public void operationComplete(IoFuture future) { ConnectFuture connFuture = (ConnectFuture)future; if( connFuture.isConnected() ){ session = future.getSession(); try { sendData(); } catch (InterruptedException e) { e.printStackTrace(); } } else { log.error("Not connected...exiting"); } } });
此段代码添加了一个监听器到ConnectorFuture对象,当收到一个客户端已经连接上的回调之后,就可以开始写数据到服务器了,写操作是通过方法sendDate()来完成的,以下就是该方法的代码:
private void sendData() throws InterruptedException { for (int i = 0; i < 30; i++) { long free = Runtime.getRuntime().freeMemory(); IoBuffer buffer = IoBuffer.allocate(8); buffer.putLong(free); buffer.flip(); session.write(buffer); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); throw new InterruptedException(e.getMessage()); } } }
该方法每隔一秒就将客户端程序空余内存数发送给服务器,共进行30次。程序分配了一个足够大的IoBuffer来存放一个长整型变量,之后将空余内存数放入该缓冲区,然后将该缓冲区的当前位置通过方法flip()重置,最后传送到服务器端。
UDP客户端就完成了。