java NIO套接字编程
在java的套接字编程中,大部分一般使用阻塞IO套接字编程。套接字的读取和写入会阻塞(也就是说不管现在有没有写入/读出数据 调用read和write方法将会阻塞)。而NIO将I/O事件注册,当特定的注册I/O事件到达时会通知您。不需要轮询,也不需要创建大量的线程下面一个例子:
package simple.socket; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.Iterator; import java.util.Set; /** * Created by banxia on 16/10/12. */ public class UseNioSocket { public static void main(String[] args) throws IOException { // 创建一个selector 对象 Selector selector = Selector.open(); ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.socket().bind(new InetSocketAddress(8888)); ssc.register(selector, SelectionKey.OP_ACCEPT); ByteBuffer buffer = ByteBuffer.allocate(1024); System.out.println("服务已经启动端口:" + 8888); while (true) { int selectNum = selector.select(); System.out.println("selectNum=" + selectNum); if (selectNum <= 0) { continue; } // 获取 Iterator<SelectionKey> it = selector.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey key = it.next(); if (key.readyOps() == SelectionKey.OP_ACCEPT) { // 接收 accept ServerSocketChannel channel = (ServerSocketChannel) key.channel(); SocketChannel accept = channel.accept(); accept.configureBlocking(false); System.out.println("接收客户端:" + accept.socket().getInetAddress().getHostAddress() + ":" + accept.socket().getPort()); accept.register(selector, SelectionKey.OP_READ); it.remove(); } else { SocketChannel sc = (SocketChannel) key.channel(); System.out.println("接收客户端:" + sc.socket().getInetAddress().getHostAddress() + ":" + sc.socket().getPort() +"开始处理..."); while (true) { buffer.clear(); long l = sc.read(buffer); if (l <= 0) { break; } System.out.print("."); buffer.flip(); sc.write(buffer); } System.out.print("\n"); it.remove(); System.out.println("接收客户端:" + sc.socket().getInetAddress().getHostAddress() + ":" + sc.socket().getPort() +"处理完成处理..."); } } } } }
相关推荐
Java套接字编程是网络通信的核心技术之一,主要用于实现客户端与服务器之间的数据交换。本文将深入探讨Java中的Socket编程,包括基本概念、工作原理、创建和使用Socket的过程,以及常见问题和解决策略。 1. 基本...
Java套接字编程是网络通信的核心技术之一,它允许两个应用程序通过网络进行数据交换。在Java中,套接字(Socket)是实现客户端-服务器模型通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。这篇笔记将...
非阻塞套接字编程的关键在于合理地使用Buffer和Selector。例如,当一个SocketChannel连接建立后,可以注册到Selector,监听读事件。当Selector通知有数据可读时,通过SocketChannel的`read`方法将数据读入Buffer,...
通道是一种连接到I/O设备(如文件、套接字或网络接口)的途径,可以实现数据的读取和写入。与BIO中的流不同,通道是双向的,既可以读也可以写。 2. **缓冲区(Buffer)**:在NIO中,数据被存储在缓冲区对象中。缓冲...
在进行套接字编程时,必须处理各种可能的异常,如`IOException`、`UnknownHostException`和`ConnectException`等。确保在网络通信出错时能优雅地关闭资源并给出错误信息。 7. **关闭套接字** 通信完成后,应关闭...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
通过实践这个简单的Java聊天室项目,初学者不仅可以掌握套接字编程的基本技巧,还能深入了解网络通信和多线程编程。这个项目对于进一步学习分布式系统、微服务架构等高级话题也有很好的铺垫作用。在实践中遇到问题时...
本篇将深入探讨Socket套接字编程的基础概念、工作原理以及如何在Java中实现。 1. 套接字基础: 套接字(Socket)是操作系统提供的接口,用于进程间的网络通信。它是连接网络应用和传输层协议(如TCP或UDP)的桥梁...
Java NIO提供了多种通道实现,如FileChannel、SocketChannel、ServerSocketChannel等,分别对应于文件、套接字和服务器套接字。 2. **缓冲区(Buffer)**:缓冲区是数据的容器,用于存储数据。与流不同,缓冲区有...
服务器的核心组件是`Selector`,它允许一个单独的线程监听多个套接字通道的状态变化。当客户端发起连接请求时,服务器会注册`ServerSocketChannel`到`Selector`上,等待连接的到来。一旦有连接请求,服务器将创建一...
了解并熟练掌握Java套接字编程,对于开发网络应用程序至关重要。无论是简单的文件传输、聊天应用,还是复杂的分布式系统,都离不开套接字这一基石。通过不断的实践和学习,开发者可以构建出高效、稳定的网络服务。
Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、套接字和UDP通信。 2. **缓冲区(Buffers)**:缓冲区是存储数据的主要对象,所有的I/O操作都是通过缓冲区进行的...
2. 通道(Channel):通道是数据源或目标的抽象,如文件、套接字等。可以从Channel读取数据到Buffer,也可以将Buffer的数据写入到Channel。 3. 非阻塞I/O:与传统的阻塞I/O不同,非阻塞I/O允许线程在等待数据就绪时...
5. **套接字通道的改进**:如支持IPv6,以及SSL/TLS加密的套接字通道。 综上所述,Java NIO 和 NIO.2 提供了强大的工具和机制,使得开发者能够构建高并发、低延迟的系统。通过学习这两部分的内容,开发者可以更好地...
通道是连接到I/O设备(如文件、网络套接字等)的桥梁,它可以读取或写入数据。通道是双向的,可以同时进行读写操作。Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于...