Java NIO笔记(七):Socket通道

使用NIO构建服务器端和客户端(上) 构建一个最基本的服务器端和客户端连接,因为网络的读写操作都是使用标准IO,所以通常使用的是Socket处理机制来实现。假如要实现一个可以为多个客户端响应的服务器,服务器端为每一个建立了连接的客户端分配一个线程,每一个线程只为一个客户端连接服务,这种多线程的服务器开发是十分常见的,它的简单实现如下。 多线程服务器简单实现 要建立能处理多客户端连接处理的服务器,需要一个线程池,为每一个提交建立连接... 阅读详情

一、Socket通道介绍

        Socket通道即套接字通道,是一种基于TCP连接协议传输数据的通道。Socket通道可以以分阻塞模式运行,并且可以被Reactor设计模式使用,因为Socket通道是可供选择的,其继承SelectableChannel类。

        非阻塞I/O是复杂的、高性能的程序构建的基础。

        使用NIO的Socket通道就没有必须像旧的Socket一样为每个Socket创建一个线程,避免了N个线程之间切换上下文的性能开销,使用NIO的Socket通道可以一个或几个线程就可以管理成百上千个已连接的Socket,并且性能消耗非常小。

  • ServerSocketChannel:负责监听某个端口,等待客户端Socket连接进来
  • SocketChannel:可以理解为一对一对使用,客户端使用SocketChannel连接服务器,服务器也会有个对等的SocketChannel
  • DatagramChannel:基于UDP发送数据报

        所有的Socket通道类被创建后都有一个关联的Socket;但是使用旧的方法直接创建Socket并不会关联一个通道,虽然它们有getChannel()方法,但是这个方法会返回null。

二、ServerSocketChannel

        ServerSocketChannel有如下方法可供使用:

  • open():打开一个ServerSocketChannel,用于创建ServerSocketChannel
  • validOps():返回SelectionKey.OP_ACCEPT,一般用不到,可用于验证注册到选择器时指定的兴趣是否位OP_ACCEPT
  • socket():返回与通道关联的ServerSocket
  • accept():等待接受一个Socket连接,非阻塞模式下可能返回null
		//打开一个ServerSocketChannel
		ServerSocketChannel ssc = ServerSocketChannel.open();
		//将通道关联的ServerSocket绑定65535端口
		//jdk1.7之后可以ssc.bind(new InetSocketAddress(65535))
		ssc.socket().bind(new InetSocketAddress(65535));
		//设置非阻塞模式
		ssc.configureBlocking(false);

三、SocketChannel

        SocketChannel有如下方法可供使用:

  • open():打开一个SocketChannel
  • open(SocketAddress remote):同open(),并指定连接服务器地址
  • validOps():返回SelectionKey.OP_READ | SelectionKey.OP_WRITE | SelectionKey.OP_CONNECT,作用同ServerSocketChannel的validOps()
  • socket():返回通道关联的Socket
  • isConnected():检查是否已连接,返回true or false
  • isConnectionPending():检查是否处于请求连接状态
  • connect(SocketAddress remote):连接指定地址服务器
  • finishConnect():强制完成连接,完成连接则返回true,返回false
  • read(ByteBuffer dst):将通道的数据读到ByteBuffer
  • read(ByteBuffer[] dsts):将通道数据分散读到ByteBuffer数组
  • read(ByteBuffer[] dsts, int offset, int length):将通道数据分散读到ByteBuffer数组,并指定读取数据的开始位置和读取的长度
  • write(ByteBuffer src):将字节缓冲区的数据写入通道
  • write(ByteBuffer[] srcs):将分散的字节缓冲区的数据聚集写入通道
  • write(ByteBuffer[] srcs, int offset, int length):同上一个方法,并指定写入数据的开始位置和长度
		SocketChannel sc = SocketChannel.open();
		sc.configureBlocking(false);
		sc.connect(new InetSocketAddress("127.0.0.1", 65535));
		//轮询直到成功连接为止
		while(!sc.isConnected()){
			
		}

四、DatagramChannel

  • open():打开一个DatagramChannel
  • validOps():返回SelectionKey.OP_READ | SelectionKey.OP_WRITE
  • socket():返回关联的DatagramSocket
  • isConnected():是否已连接
  • connect(SocketAddress remote)》:连接某个地址
  • disconnect():断开连接
  • receive(ByteBuffer dst):接收数据,从通道读入缓冲区
  • send(ByteBuffer src, SocketAddress target):将缓冲区的数据发送到指定网络地址
  • read(ByteBuffer dst)
  • read(ByteBuffer[] dsts)
  • read(ByteBuffer[] dsts, int offset, int length)
  • write(ByteBuffer src)
  • write(ByteBuffer[] srcs)
  • write(ByteBuffer[] srcs, int offset, int length)

        这么需要说明下,DatagramChannel提供了connect方法,别被这样的方法套住了,DatagramSocket是基于UDP的,UDP是无连接的,connection方法只是绑定某个地址,只能从这个地址接收数据或发送数据到这个地址。

        这节主要介绍3个Socket通道的API,读取若想感受下他们的实际的使用,可以到下面两个地址下载实战源码:

  • Java简单版飞鸽传书:http://download.youkuaiyun.com/detail/abc_key/7497543
  • Java简单聊天室:http://download.youkuaiyun.com/detail/abc_key/7459723
基于NIO的Socket通信(使用Java NIO的综合示例讲解) 本篇文章并不是NIO和Socket的入门文章,如果你在看完后有些难度可以先学习基础知识后再进行阅读,但是本文的一些概念不论是入门还是学习已久的人都会有些许收获。(感觉基础不足的可以阅读前文两个链接来获取更多的细节) 一、NIO的简介 Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,Java NIO提供了与标准IO不同的IO工作方式: IO NIO... 阅读详情

相关推荐

java NIO非阻塞方式的Socket编程

1.非阻塞方式的Socket编程: 传统阻塞方式的Socket编程,在读取或者写入数据时,TCP程序会阻塞直到客户端和服务端成功连接,UDP程序会阻塞直到读取到数据或写入数据。阻塞方式会影响程序性能,JDK5之后的NIO引入了非阻塞方式的Socket编程,非阻塞方式的Socket编程主要是使用Socket通道和Selector通道选择器,将Socket通道注册到通道选择器上,通过通道选择器选择通

Tony Chen的专栏 2万+

Java Socket实现NIO通信

手写NIO通信,其实并不复杂

在路上 2752

使用Java NIO构建Socket服务器的实战指南

Java NIO(New IO,Non-Blocking IO)是Java提供的一套非阻塞IO的API,它支持面向缓冲区的、基于通道的IO操作。与传统的Java IO相比,NIO的引入为Java IO带来了更多的功能和灵活性,特别是在处理大量并发连接时。Java NIO中的是用于监听新进来的TCP连接的通道,就像标准IO中的一样。但不同的是,是通过通道的API进行操作,使的我们能够构建非阻塞的服务器。通过。

weixin_32098457的博客 1104

Java网络编程:Socket与NIO技术详解

1.背景介绍 1. 背景介绍 Java网络编程是一门重要的技能,它涉及到通信、数据传输、并发等多个领域。在Java中,Socket和NIO是两种常用的网络编程技术,它们各自具有不同的优势和应用场景。本文将详细介绍Socket与NIO技术的核心概念、算法原理、最佳实践以及实际应用场景。 2. 核心概念与联系 2.1 Socket概述 Socket是一种用于建立客户端和服务端之间通信的技术,...

AI天才研究院 2118

【分子指纹】化学分子指纹的概念和应用(非常重要)

分子指纹(Molecular fingerprints)可以低计算成本的方式表示大规模化学数据集中化合物的化学(结构、物理化学等)性质。它们在将化学数据集中的分子转换为适合于计算方法的一致输入格式(bit向量或数值)方面发挥着重要作用。在这篇综述中,

DJJ5210的博客 1万+

ArcGIS-裁剪遥感影像及dem图像

6、选择【工具箱】-【数据管理工具】-【栅格】-【裁剪】。在【输入栅格】里选择要裁剪的dem,在【输出范围】里选择刚创建的裁剪范围。选择一个输出路径,其他参数保存默认。2、起一个名称,要素类型选择【面】。点击【编辑】选择与要裁剪的dem一致的地理坐标系。1、创建需要裁剪区域的面层shp,右击选择【新建】-【shapefile】3、点击编辑器,选择开始编辑。4、选择【裁剪范围】,点击确定。5、画出想要裁剪的范围并保存。

siwenaiyou的博客 1万+

[MINA2.0源码](二)客户端发起连接请求——NioSocketConnector

NioSocketConnector负责客户端向服务端发起连接请求,会创建一个NioSocketSession,尤其负责读写操作。功能与服务端的NioSocketAcceptor相对应,他们都是IoServer的子类,功能类似。 MINA客户端代码: public connectServer() { // set local connector connector = new N

woorh的专栏 6889

基因组注释(Annotation)

Annotation

hgz2020的博客 6491

Java NIO实战篇:使用Socket实现报文交互

最近有个对接渠道需求,对方提供文档中要求使用Socket短链接的方式进行报文交互,所以这边采用NIO方式编写Socket。

猪大肠的博客 2722

RAGFlow + GraphRAG+ 知识图谱 + QwQ32B探索实践

RagFlow 是一款开源的 RAG(Retrieval-Augmented Generation)引擎,专注于深度文档理解,能够助力企业及个人构建高效的 RAG 工作流程。借助大语言模型(LLM),它可以精准处理各种复杂格式的数据,为用户提供可靠的问答服务,并附上详实的引用依据。

技术引领业务创新 8万+

D触发器版图设计的艺术:最小化面积与最大化性能的平衡之道

本文探讨了D触发器版图设计中如何平衡最小化面积与最大化性能的核心挑战。通过分析晶体管布局、互联优化、时钟分布等关键策略,结合先进制程下的功耗与信号完整性考量,为数字IC工程师提供了从基础优化到制造验证的实用解决方案,助力实现高性能、低面积的芯片设计。

aa123的博客 910

NIO与Socket笔记 : Socket、NIO 理论

一、Socket 理论 Socket编程其实就是实现服务端与客户端的数据通信,不管使用任何的编程语言, 在 实现上基本上都是4个步骤: 1建立连接;2请求连接; 3回应数据; 4结束连接,这4个 步骤的流程图如图 1-3所示。 在学习 NIO 之前,必须先学习 Socket,因 为 NIO 中的核心通道类都是基于 Socket技术的通道类 。 学习 Socket 时要着重学...

张伯毅的专栏 6779

【git】git: ‘interpret-trailers’ is not a git command. See ‘git --help’

cents 7.6系统. yum源安装git最新版本是1.8.3 报错: git: 'interpret-trailers' is not a git command. See 'git --help'. cannot insert change-id line in .git/COMMIT_EDITMSG 解决: git add xxx git commit -m "xxx" 然后修改 vim .git/hooks/commit-msg #if test -n "${reviewurl}" ; th

machh的专栏 4758

Java NIO4:Socket通道

Socket通道 上文讲述了通道、文件通道,这篇文章来讲述一下Socket通道,Socket通道与文件通道有着不一样的特征,分三点说:      1、NIO的Socket通道类可以运行于非阻塞模式并且是可选择的,这两个性能可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性,因此,再也没有为每个Socket连接使用一个线程的必要了。这一特性避免了管理大量线程所需的上下文交换总开销,...

laomumu1992的博客 368

【26美赛A题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

本文介绍了2026年美赛数学建模A题的解题思路与方法。A题通常属于连续型系统问题,重点在于构建可解释的机理模型,通过将现实机制转化为动态方程进行仿真预测。文章提出了通用建模路线,包括机理抽象、模型假设、动态建模、参数识别、系统仿真和情景预测六个阶段。专栏将提供从机理到方程的系统建模思路、参数标定方法、Python/Matlab实现代码以及高分论文模板。内容适合参加2026美赛A题、偏重物理/工程建模方向的参赛队伍,旨在提升机理建模能力。后续将更新完整题解和源码。

一键难忘的博客 2008

【EPS精品教程】EPS2016三维测图版安装教程(附EPS2016安装包下载地址)

EPS地理信息工作站是北京清华山维新技术开发有限公司历经十五年精心研发和打造,为满足“以地理信息服务为中心”的信息化测绘生产需求而推出的测绘生产活动多种业务模块集成化软件系统。主要功能有:(1)测绘与地理信息多业务模块集成管理;(2)多元多尺度多种类数据集成管理;(3)跨平台异构数据转换;(4)数据监理;(5)自动缩编与综合;(6)坐标转换与动态投影;(7)地理信息模板定制;(8)GIS地理信息描述与CAD图形表达一体化支持;(9)GIS数据库更新维护;(10)图形打印与地图出版。 一、安装过程 EP..

智慧空间实验室 2万+

java nio 详_java NIO 详解

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。本系列教程将有助于你学习和理解Java NIO。Java NIO提供了与标准IO不同的IO工作方式:Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总...

weixin_35282700的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NIO系列(四)——socket通道和serversocket通道

SocketChannel SocketChannel是一个连接到tcp网络套接字的通道。可以通过以下2中方式创建 1.打开一个SocketChannel并连接到互联网上的某台服务器。 SocketChannel client = SocketChannel.open(new InetSocketAddress("127.0.0.1",10699)); 2.ServerSocketChan

咸鱼老罗的博客 1703

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java NIO系列教程(三) Channel之Socket通道

本章节介绍socket通道类。 一、Socket通道   新的socket通道类可以运行非阻塞模式并且是可选择的。这两个性能可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性。本节中我们会看到,再也没有为每个socket连接使用一个线程的必要了,也避免了管理大量线程所需的上下文交换总开销。借助新的NIO类,一个或几个线程就可以管理成百上千的活动socket连接了并且只有很少甚至可能没有性能损失。所有的socket通道类(DatagramChannel、SocketChannel和Serve

weixin_42073629的博客 1380

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

基于Java NIO的Socket通信

Java NIO模式的Socket通信,是一种同步非阻塞IO设计模式,它为Reactor模式实现提供了基础。 下面看看,Java实现的一个服务端和客户端通信的例子。 NIO模式的基本原理描述如下: 服务端打开一个通道(ServerSocketChannel),并向通道中注册一个选择器(Selector),这个选择器是与一些感兴趣的操作的标识(SelectionKey,即通过这个标识可以定位到

千与的专栏 2万+

NIO之三Socket通道

1 Socket通道   所有的socket通道类(DatagramChannel、SocketChannel和ServerSocketChannel)都继承了位于java.nio.channels.spi包中的AbstractSelectableChannel。请注意DatagramChannel和SocketChannel实现定义读和写功能的接口而ServerSocketChannel不实现...

weixin_30389003的博客 137

socket服务端代码_Java NIO4:Socket通道

Socket通道上文讲述了通道、文件通道,这篇文章来讲述一下Socket通道,Socket通道与文件通道有着不一样的特征,分三点说:1、NIO的Socket通道类可以运行于非阻塞模式并且是可选择的,这两个性能可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性,因此,再也没有为每个Socket连接使用一个线程的必要了。这一特性避免了管理大量线程所需的上下文交换总开销,借助NIO类,一个...

weixin_39662834的博客 106

java nio 通道_Java NIO之通道

通道channel用于字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效的传输数据。通道时一种途径,通过这种途径,可以用最小的总开销来访问操作系统本身的IO服务,缓冲区则是通道内部用于发送和接受数据的断点。通道基础顶层接口Channel,次级接口WritableByteChannel、ReadableByteChannel、InterruptibleChannel等。描述通道行为的...

weixin_30595763的博客 211

使用Java的IO/NIO处理网络编程:Socket、ServerSocket和NIO通道

需要注意的是,NIO是基于事件驱动的,可以使用Selector来监听多个通道的事件,以提高效率和扩展性。在Java中,可以使用Socket和ServerSocket类进行基于IO的网络编程,以及使用NIO(New IO)中的通道(Channel)进行基于NIO的网络编程。System.out.println("接收到服务器的响应:" + response.toString());无论是基于IO的网络编程还是基于NIO的网络编程,都需要注意资源的释放和异常处理,以确保程序的稳定性和可靠性。

m0_75198698的博客 928

java nio socket 例子_Java NIO Socket编程实例

各I/O模型优缺点BIO通信模型BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接线程池I/O编程假如所有可用线程都被阻塞,后续I/O都将在队列中排队线程池采用阻塞队列实现,队列积满之后,后续入队列操作将被阻塞,新的客户端请求被拒绝,发生大量连接超时NIO编程缓冲区Buffer每一种Java基本类型都有对一种缓冲区大...

weixin_33871933的博客 292
上一篇: Java NIO笔记(六):内存映射文件及文件通道到通道批量传输数据
下一篇: Java NIO笔记(八):选择器
xlight2023
博客等级 码龄15年 236粉丝 32原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值