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

libfacedetection 框架阅读及扩展经验

libfacedetection 框架源码解析与扩展心得1. libfacedetection 框架简介2. 源码解析2.1 facedetectcnn.h2.2 facedetectcnn.cpp2.3 facedetectcnn-model.cpp3. 其他层的扩展--depthwise convolution 前段时间因为工作需要,对libfacedetection框架做了些扩展,在阅读源...

weixin_42616332的博客 1500

浮点数加法器设计

一.设计内容及其要求 内容 根据浮点数的运算规则和IEEE754标准,实现浮点数的加法运算器。 要求: 浮点数格式:符号位1位,阶码8位,尾数23位 要求该实验能完整的体现浮点数的运算的五个步骤:对阶、尾数求和、规格化、舍入(要求使用对偶舍入)、溢出判断。 二.基本要素 浮点数 浮点数即实数,实数是所有有理数和无理数的集合。它之所以被称作浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置。 计算机中的浮点运算的计算结果一般是不确定的,一块芯片的浮点运算

Phoenix_ZengHao的博客 1万+

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

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

woorh的专栏 6889

实战指南:如何优雅解决SpringBoot3与Mybatis-Plus的版本兼容性问题

本文深入解析SpringBoot3与Mybatis-Plus的版本兼容性问题,提供实战解决方案。通过Maven依赖排除策略、Gradle配置方案及自动配置覆盖策略,有效解决包冲突和初始化顺序问题,确保项目平稳升级。适用于开发者快速解决SpringBoot3与Mybatis-Plus的集成难题。

weixin_28432777的博客 597

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

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

猪大肠的博客 2722

手把手教你用分立元件搭建自举电路:解决高端MOS驱动难题

本文详细介绍了如何用分立元件搭建自举电路,解决高端MOS驱动中的栅源极电压不足问题。通过面包板实验,逐步讲解二极管、电容等关键元件的选型与电路搭建,提供波形调试和常见问题排查方法,帮助工程师提升开关电源和电机驱动等应用的效率与可靠性。

weixin_30555125的博客 152

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 242

NIO与Socket笔记 : Socket、NIO 理论

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

张伯毅的专栏 6779

帝企鹅优化器(EPO)详解:从基础原理到代码实战

帝企鹅优化器(EPO)是受帝企鹅群体在极寒环境中抱团取暖行为启发,于2018年提出的一种群体智能优化算法。其核心机制是模拟帝企鹅种群通过动态调整位置来维持体温的过程,主要包括确定集群边界、计算温度分布、衡量个体间距离以及更新位置四个步骤,从而在求解复杂优化问题时有效平衡全局探索与局部开发。该算法具有参数少、结构清晰、易于实现等优点,在工程优化、图像处理、机器学习特征选择以及冷链物流车辆路径规划等领域展现出良好的应用潜力。

qq_42212808的博客 139

Java NIO4:Socket通道

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

laomumu1992的博客 368

R语言glm函数构建二分类logistic回归模型、epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值

R语言glm函数构建二分类logistic回归模型(family参数为binomial)、使用epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)

statistics+insight+vista+power 1397

论文阅读:Training language models to follow instructions with human feedback

这篇论文的目标是通过引入一种基于人类反馈的训练方法,来让语言模型更好地按照用户意图行事。这是因为大规模语言模型虽然强大,但有时候会生成不准确、有偏见或者对用户无帮助的内容,这说明它们和用户的需求之间存在一定的“错位”。论文提出了一个新方法,将 GPT-3 进行优化,称为示例数据与监督学习:让人类标注员生成一些正确行为的示例,并使用这些示例来初步优化模型。比较数据与奖励模型:让标注员比较模型生成的多个输出,并将其排序,从中学到模型输出的优劣规则。强化学习优化:基于这些规则,使用强化学习算法进一步优化模型。

CSPhD-winston的博客 1715

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万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

咸鱼老罗的博客 1703

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

weixin_42073629的博客 1380

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于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、付费专栏及课程。

余额充值