SocketChannel是NIO形式的客户端服务器通信的形式,支持异步非阻塞连接,通过管道与缓存的形式进行通信,与Java的Socket是有区别的,socket是通过请求——连接的形式进行通信,而SocketChannel是通过建立管道的形式进行通信,原则上,SocketChannel要比Socket快,这只是自己的理解,不知道正确与否了。。。下面总结下SocketChannel形式的代码实现:
一、服务器端:
import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; public class ServerSocketChannelTest { public static void main(String[] args) throws Exception { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress(9999)); while(true){ SocketChannel socketChannel = serverSocketChannel.accept(); ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = socketChannel.read(buf); while (bytesRead != -1) { System.out.println("Read " + bytesRead); buf.flip(); while(buf.hasRemaining()){ System.out.print((char) buf.get()); } buf.clear(); bytesRead = socketChannel.read(buf); } } } }
这个阻塞的形式,也就是在serverSocketChannel.accept();处,只有当客户端有请求进行通道链接时,才会向下执行,下面是非阻塞形式的代码:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress(9999)); serverSocketChannel.configureBlocking(false); //设置为非阻塞式 while(true){ SocketChannel socketChannel = serverSocketChannel.accept(); if(socketChannel != null){ //为非阻塞式时,要进行非空判断 //do something with socketChannel... } }
二、客户端代码:
import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; public class SocketChannelTest { public static void main(String[] args) throws Exception { SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("localhost", 9999)); String newData = "New String to write to socket...." + System.currentTimeMillis(); ByteBuffer buf = ByteBuffer.allocate(48); buf.clear(); buf.put(newData.getBytes()); buf.flip(); while(buf.hasRemaining()) { socketChannel.write(buf); } socketChannel.close(); } }
相关推荐
本文将深入探讨这些组件,并通过一个实际案例——"NServer.java"和"NClient.java"来阐述它们的工作原理和用法。 首先,让我们了解这三个核心组件: 1. **SocketChannel**:SocketChannel是Java NIO的一部分,它...
在阅读或实现`byteBufferTest.java`时,注意观察如何利用ByteBuffer的特性进行高效的数据传输,例如与FileChannel配合读写文件,或者在网络编程中与SocketChannel交互。同时,理解源码可以帮助深入理解Java NIO的...
首先,我们要理解Java NIO的核心组件之一——流。在Java的IO体系中,流是数据传输的抽象,它代表了数据的流向,可以是输入流(InputStream)或输出流(OutputStream)。然而,NIO中的流与传统的IO流有所不同,它们...
#### Java——JUC - **并发编程基础**: - 多线程编程:介绍多线程编程的基本概念,包括线程的创建与启动。 - 线程安全问题:理解线程安全的概念,学习同步机制如synchronized关键字等。 - volatile关键字:介绍...
Java NIO 提供了多种通道,如FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,分别用于文件、UDP和TCP网络通信。 2. **缓冲区(Buffer)**:缓冲区是NIO中的核心概念,它是数据的容器。读取数据...
首先,我们要明白Java网络编程的基础——Socket编程。Socket是网络通信中的基本组件,它提供了应用程序与网络协议之间的接口。Java的`java.net.Socket`和`ServerSocket`类是实现客户端和服务器通信的关键。客户端...
本合集包含了两本关于这些主题的专业书籍——"Java IO"和"Java NIO",它们详细阐述了Java平台上的输入/输出机制。 首先,让我们深入了解Java IO。Java IO库是Java最初版本的一部分,提供了一系列类和接口来处理数据...
Java技能百练——网络篇是针对Java开发者在网络编程方面的深入学习和实践。在这个主题中,我们将探讨Java在处理网络通信、数据传输以及网络服务开发等多个关键领域的应用。下面,我们将详细解析Java网络编程的一些...
本章主要探讨的是Java NIO中的核心概念——通道(Channel)。通道是Java NIO中连接到I/O设备(如文件、网络套接字、硬件设备等)的接口,它允许数据从源到目的地进行传输。 在Java NIO中,通道和缓冲区(Buffer)是...
`java.nio`包包含了与NIO相关的类,如`FileChannel`、`SocketChannel`和`Selector`等。 在多线程处理上,Java 4引入了`java.util.concurrent`包,这是Java并发库的基础,包含了各种高级并发工具,如`...
除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...
随着JDK 1.4的发布,一个新的输入输出库——NIO(New Input/Output)被引入到了Java标准库中。NIO库提供了高速、面向块的数据读写能力,并且全部基于标准的Java代码实现。本文档旨在为Java程序员提供一个全面深入...
为了解决这一问题,从JDK 1.4开始,Java引入了一种新的I/O模型——**非阻塞I/O (NIO)**。 NIO提供了一种基于缓冲区(Buffer)的非阻塞I/O操作机制,极大地提高了I/O处理的性能和效率。本文将详细介绍NIO的主要组成...
总之,Java NIO的四大核心组件——通道、缓冲区、选择器和文件映射,提供了更灵活和高效的I/O操作方式,为开发者在处理高并发、大数据量的场景下提供了强大的工具。正确理解和运用这些组件,能够显著提升Java应用的...
- **NIO (New IO)**:随着JDK 1.4的发布,Java引入了一种全新的IO处理方式——NIO,它提供了一系列新特性和改进,以提高IO效率。 NIO的关键特性包括但不限于: - **缓存(Buffer)支持**:为所有的原始类型提供缓存...
Java NIO提供了多种Channel实现,如FileChannel、SocketChannel和DatagramChannel等,分别对应文件、套接字和UDP通信。 知识点3:Buffer Buffer是NIO中的核心组件,它是一个特定类型数据(如字节、字符、整数等)的...
首先,我们需要了解`java.nio`包中的各类通道类,如FileChannel、SocketChannel和ServerSocketChannel等,它们分别对应于文件操作、网络连接的客户端和服务端。接着,深入研究缓冲区,包括ByteBuffer、CharBuffer、...
为了解决这些问题,Java平台在JDK 1.4中引入了一个全新的I/O处理框架——NIO(New IO),即新I/O。本文将深入探讨传统I/O模型的问题,并详细介绍NIO的概念、优势以及其实现机制。 #### 2. 传统I/O模型及其局限性 ...