基于naga开发的TCP客户端/服务器的二次开发,目的是为了更快,更好地使用TCP网络进行上层业务开发。
纯属个人研究项目,如有需要,请到http://download.csdn.net/detail/lipslive/5254309下载源代码。
1、利用“naga-2_1-r42.jar”包进行二次开发。
2、调用NIOService类中的打开socket和serverSocket方法进行封装。
3、naga包中服务器端应用举例如下:
NIOService service1 = new NIOService(); NIOServerSocket serverSocket = service1.openServerSocket(port); // 设置监听事件,包括打开监听后,关闭后这两个: serverSocket.listen(new ServerSocketObserverAdapter() { public void newConnection(NIOSocket nioSocket) { // 可在此处添加处理事件 } public void serverSocketDied(Exception exception) { // 关闭serverSocket处理 } }); // 还需要一个循环事件,执行事件监听,此处可能需要使用到多线程编程 // 设置接收链接方式 serverSocket.setConnectionAcceptor(ConnectionAcceptor.ALLOW); while (true) { // 循环不断监听事件 service1.selectBlocking(1); }
4、在naga客户端中,包括链接上,接收包,关闭链接后三个事件和write()方法:
NIOService service2 = new NIOService(); NIOSocket socket = service2.openSocket(InetAddress.getLocalHost(), port); // 设置接收包格式 nioSocket.setPacketReader(new RegularPacketReader(1, true)); nioSocket.setPacketWriter(new RegularPacketWriter(1, true)); nioSocket.listen(new SocketObserverAdapter() { public void connectionBroken(NIOSocket nioSocket, Exception arg1) { // 打开后处理 System.out.println("Client ip:" + nioSocket.getIp() +" port:"+nioSocket.getPort()+ " disconnected."); nioSocket.close(); isConnected = false; } public void connectionOpened(NIOSocket nioSocket) { // 关闭链接后处理 System.out.println("Client ip:" + nioSocket.getIp() +" port:"+nioSocket.getPort()+ " connected."); } public void packetReceived(NIOSocket nioSocket, byte[] packet) { revNum = nioSocket.getBytesRead(); // 包处理 revDataAndParse(packet); }}); // 还需要一个循环监听事件并执行,此处可能需要使用到多线程编程 while (true) { service2.selectBlocking(1); }
5、该项目开发过程基本上是以上3、4点的封装过程,实现一个客户端基础类(TCPClientBase)和服务器端基础类(TCPServerBase),其中客户端基础类有两种方式,一种是使用于单独的客户端的单元;另一种使用与服务器端接收一个链接后的单元。
通信原理图如下:
6、项目类使用举例:
1) communication.tcp.client.TCPClientBase是基础抽象类,任何外部使用都必须继承该类,并重写一个“protected abstract void revDataAndParse(byte[] data);”方法,建议外部重写时,设置成protected&private以防止类外部调用。同样在继承该基础类时,可以在继承类中添加各种需要的引用及必要的方法,实例在communication.tcp.example.TCPClientUnit体现,重写revDataAndParse方法如下:
/** * 处理数据将数据置于队列中,或者直接解析....... */ protected void revDataAndParse(byte[] data) { // SystemOut.arrayToHexString(data); // sendData(data); // System.out.println(new String(data)); }
2) communication.tcp.server.TCPServerBase也是基础抽象类,任何外部使用都必须继承该类,并重写至少包括一些内容:
/** * 服务器端构造方法 * @param ip * @param port * @throws ClassNotFoundException */ @SuppressWarnings("unchecked") public TCPServerUnit(String ip, int port) throws ClassNotFoundException { // 注意保持与泛型中的类一致性 super(ip, port,(Class<TCPClientUnit4Server>) Class.forName(TCPClientUnit4Server.class.getName())); }
7、弊端:
程序为未经过严格的验证,使用效果如何未知;客户端中的接收包有一定的局限性,接收数据包不利于开发解析,对于实时性要求比较
高的系统不一定适用,如modbusTCP。
8、详细使用过程,请参考doc目录中的api帮助文档和naga相关文档。