`

Java——SocketChannel

阅读更多

       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();
	}
}
1
6
分享到:
评论

相关推荐

    SocketChannel、ServerSocketChannel与Selector的实际案例

    本文将深入探讨这些组件,并通过一个实际案例——"NServer.java"和"NClient.java"来阐述它们的工作原理和用法。 首先,让我们了解这三个核心组件: 1. **SocketChannel**:SocketChannel是Java NIO的一部分,它...

    Java NIO学习笔记——ByteBuffer用法

    在阅读或实现`byteBufferTest.java`时,注意观察如何利用ByteBuffer的特性进行高效的数据传输,例如与FileChannel配合读写文件,或者在网络编程中与SocketChannel交互。同时,理解源码可以帮助深入理解Java NIO的...

    Java语言基础教程-Java NIO流篇2

    首先,我们要理解Java NIO的核心组件之一——流。在Java的IO体系中,流是数据传输的抽象,它代表了数据的流向,可以是输入流(InputStream)或输出流(OutputStream)。然而,NIO中的流与传统的IO流有所不同,它们...

    2018尚硅谷Java培训视频链接_Java基础阶段

    #### Java——JUC - **并发编程基础**: - 多线程编程:介绍多线程编程的基本概念,包括线程的创建与启动。 - 线程安全问题:理解线程安全的概念,学习同步机制如synchronized关键字等。 - volatile关键字:介绍...

    javaNIO学习笔记(csdn)————程序.pdf

    Java NIO 提供了多种通道,如FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,分别用于文件、UDP和TCP网络通信。 2. **缓冲区(Buffer)**:缓冲区是NIO中的核心概念,它是数据的容器。读取数据...

    java网络编程(中文)

    首先,我们要明白Java网络编程的基础——Socket编程。Socket是网络通信中的基本组件,它提供了应用程序与网络协议之间的接口。Java的`java.net.Socket`和`ServerSocket`类是实现客户端和服务器通信的关键。客户端...

    Java IO合集

    本合集包含了两本关于这些主题的专业书籍——"Java IO"和"Java NIO",它们详细阐述了Java平台上的输入/输出机制。 首先,让我们深入了解Java IO。Java IO库是Java最初版本的一部分,提供了一系列类和接口来处理数据...

    java技能百练--网络篇

    Java技能百练——网络篇是针对Java开发者在网络编程方面的深入学习和实践。在这个主题中,我们将探讨Java在处理网络通信、数据传输以及网络服务开发等多个关键领域的应用。下面,我们将详细解析Java网络编程的一些...

    032002_【第20章:Java新IO】_通道(Channel)_java_hearing3oc_扣弄你澳大_stoppedh

    本章主要探讨的是Java NIO中的核心概念——通道(Channel)。通道是Java NIO中连接到I/O设备(如文件、网络套接字、硬件设备等)的接口,它允许数据从源到目的地进行传输。 在Java NIO中,通道和缓冲区(Buffer)是...

    java4:Java 4 课程作业。

    `java.nio`包包含了与NIO相关的类,如`FileChannel`、`SocketChannel`和`Selector`等。 在多线程处理上,Java 4引入了`java.util.concurrent`包,这是Java并发库的基础,包含了各种高级并发工具,如`...

    Java-NIO-系列教程

    除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...

    Java Nio ibm技术文档

    随着JDK 1.4的发布,一个新的输入输出库——NIO(New Input/Output)被引入到了Java标准库中。NIO库提供了高速、面向块的数据读写能力,并且全部基于标准的Java代码实现。本文档旨在为Java程序员提供一个全面深入...

    Java_NIO_API详解

    为了解决这一问题,从JDK 1.4开始,Java引入了一种新的I/O模型——**非阻塞I/O (NIO)**。 NIO提供了一种基于缓冲区(Buffer)的非阻塞I/O操作机制,极大地提高了I/O处理的性能和效率。本文将详细介绍NIO的主要组成...

    Java NIO中四大核心组件的使用详解

    总之,Java NIO的四大核心组件——通道、缓冲区、选择器和文件映射,提供了更灵活和高效的I/O操作方式,为开发者在处理高并发、大数据量的场景下提供了强大的工具。正确理解和运用这些组件,能够显著提升Java应用的...

    Java nio详细介绍 详细介绍java nio

    - **NIO (New IO)**:随着JDK 1.4的发布,Java引入了一种全新的IO处理方式——NIO,它提供了一系列新特性和改进,以提高IO效率。 NIO的关键特性包括但不限于: - **缓存(Buffer)支持**:为所有的原始类型提供缓存...

    JAVA的IO与NIO

    Java NIO提供了多种Channel实现,如FileChannel、SocketChannel和DatagramChannel等,分别对应文件、套接字和UDP通信。 知识点3:Buffer Buffer是NIO中的核心组件,它是一个特定类型数据(如字节、字符、整数等)的...

    大数据学习之旅——NIO源码

    首先,我们需要了解`java.nio`包中的各类通道类,如FileChannel、SocketChannel和ServerSocketChannel等,它们分别对应于文件操作、网络连接的客户端和服务端。接着,深入研究缓冲区,包括ByteBuffer、CharBuffer、...

    javaNiO.doc

    为了解决这些问题,Java平台在JDK 1.4中引入了一个全新的I/O处理框架——NIO(New IO),即新I/O。本文将深入探讨传统I/O模型的问题,并详细介绍NIO的概念、优势以及其实现机制。 #### 2. 传统I/O模型及其局限性 ...

Global site tag (gtag.js) - Google Analytics