Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

【个人项目】基于naga开发的TCP客户端/服务器介绍

$
0
0

基于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相关文档。



作者:lipslive 发表于2013-4-13 18:05:41 原文链接
阅读:1 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>