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

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 454

Halcon与C#联合编程(一):使用S7协议实现机器视觉上位机与西门子PLC联动

本项目技术栈:C#基础,多线程,Halcon DirectShow,Halcon形状检测,Halcon QR码识别,西门子S7通讯协议,西门子PLC为核心的下位机及执行元件

虎鲸不是鱼 1万+

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

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

woorh的专栏 6889

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 263

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

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

猪大肠的博客 2722

汽车车牌识别系统实现(二)--车牌定位+代码实现

汽车车牌识别系统实现(二)-- 车牌定位 前言 本人大四计算机视觉处理方面菜鸟一枚,因个人兴趣和毕设的缘故,故而想学习计算机视觉方面的内容,有不正确的地方还等各位大神批评指正。 图像预处理 照相机获取到汽车车牌图像时,绝大多数情况下,图像里只存在一个车牌的情况是不太现实的,一幅图像里存在建筑物、树、其它汽车等等是很正常的;而且绝大多数都会存在噪声点,这种情况下就会对车牌定位和识别造成极大程度的干扰...

奋斗の博客 1万+

如何实现chrome谷歌浏览器多开(独立环境 独立cookie)

由于各种各样的原因,你可能需要在一个电脑登录某个平台,比如一个电脑登录3个公众号,或者3个知乎等等。最简单的方案是,直接安装3个不同的浏览器,比如一个谷歌浏览器,一个火狐浏览器,一个 Edge 浏览器。这个方案也能解决,但如果想多开10个呢?安装10个不同的浏览器也能解决,但感觉这样比较复杂,另外一方面安装太多的应用,会导致电脑卡顿。这里给大家介绍,我在 Win 和 Mac 系统下的躲开解决方案。Win 系统下的解决方案最为简单,原理就是给不同的谷歌浏览器,指向不同的用户存储路径即可。

lzqial1987的专栏 1万+

NIO与Socket笔记 : Socket、NIO 理论

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

张伯毅的专栏 6779

kbjdbc: autodetected server-encoding to be ISO-8859-1, if the message is not readable, please check

这条信息是来自 KingbaseES 数据库的一个 JDBC 客户端连接提示。KingbaseES 是一个企业级的关系型数据库管理系统,它兼容 PostgreSQL 的许多特性。如果上述步骤仍然无法解决问题,建议详细查看数据库和客户端的日志文件,以获取更具体的错误信息。此外,也可以考虑联系 KingbaseES 的技术支持获取帮助。项目融合kingbase数据库,输出日志乱码。结果:网上各种调整各种试。

zjy660358的专栏 4843

Java NIO4:Socket通道

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

laomumu1992的博客 368

基于JeecgBoot 3.9.0 开源项目的企业管理平台

基于JeecgBoot 3.9.0 开源项目的企业管理平台

宁波阿成的博客 374

2026年紫光同创数字IC笔试试卷带答案

FPGA基础知识与设计要点摘要 本文围绕FPGA与数字IC设计核心概念,通过单选题、波形分析题、多选题和简答题形式,系统梳理了以下关键知识点: FPGA基础架构 查找表(LUT)是实现组合逻辑的基本单元(题1) CLB包含LUT、触发器和进位链,后者加速算术运算(题6,10) 布局布线优化是减少关键路径延迟的核心方法(题7) 时序分析要点 建立时间(时钟沿前数据需稳定)与保持时间(时钟沿后需保持)的定义(题2,简答1) 亚稳态成因及两级同步器处理跨时钟域信号的方法(多选题1,波形题5) 特殊设计技术 异步复

Open 114

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

咸鱼老罗的博客 1703

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

weixin_42073629的博客 1380

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

余额充值