Naga-Socket: Java NIO异步套接字库的简洁实现

需积分: 9 0 下载量 95 浏览量 更新于2024-11-25 收藏 98KB ZIP 举报
资源摘要信息:"Naga-Socket是一个用Java编写的简化版NIO(New Input/Output)异步套接字库。它旨在成为一个小巧且功能集中的库,通过提供一系列封装了异步NIO操作的Java类来简化网络编程。Naga-Socket库的设计初衰是为了解决客户端和服务器端编程中常见的线程管理问题,其核心特点是通过单个线程来驱动所有I/O操作,这使得它特别适合在需要避免多线程复杂性的应用场景中使用。 Naga-Socket的两个主要组件是Socket和ServerSocket。Socket是网络通信的基础,用于客户端到服务器的单个连接。ServerSocket则用于监听端口,接受来自客户端的连接请求。Naga-Socket通过异步NIO的方式处理这些组件,从而提高了性能并减少了资源消耗。 Naga-Socket库专注于简化NIO编程模型,它自动处理了部分读取缓冲区和设置各种选择键标志的复杂性。因此,开发者可以更加聚焦于业务逻辑的实现,而不必深入底层的NIO细节。这意味着开发者在编写网络通信代码时,可以减少出错的机会,提高开发效率。 此外,Naga-Socket库被设计为轻量级,它没有引入额外的线程或事件队列,纯粹是NIO的封装,提供了一个清晰的编程接口供用户操作。这种设计使得Naga-Socket易于理解和使用,同时也方便用户在其基础上进行扩展,实现更复杂的功能。 为了进一步说明Naga-Socket的使用,文档中提到了创建一个简单的回显服务器作为入门示例。回显服务器是一种网络服务,它接收客户端发送的消息,并将相同的消息发送回客户端。这个例子不仅可以作为学习Naga-Socket的基础,也是一个检验网络编程知识的有效工具。 从文件名Naga-Socket-master可以看出,这个压缩包文件包含了Naga-Socket库的所有源代码和可能的示例程序。'master'通常指代版本控制中的主分支,表明这个压缩包包含了当前版本的完整源代码,适合开发者下载使用或进行开发。 总的来说,Naga-Socket是一个为Java网络编程带来简化与便利的库,它通过提供一个高效的异步NIO接口,帮助开发者快速构建高性能的网络应用程序。由于Naga-Socket库的小巧和简单特性,它对于初学者和希望避免复杂网络编程模型的开发者来说,是一个非常有价值的选择。"
2013-04-13 上传
1、利用“naga-2_1-r42.jar”包进行二次开发; 2、调用NIOService类中的打开socket和serverSocket函数进行编程; 3、例如,服务器端: 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、又例如,客户端,包括链接上,接收包,关闭链接后三个事件和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帮助文档。