NIO socket服务器注意的几点.

     当你看到这篇文章的时候,也许是像我一样,以经用google搜了一大堆socket的例子运行调试成功了.但是在实际应用中有几点需要注意的地方.要不然你的服务器还是一大堆的bug.

 

1.注册读事件.

     客户端第刚链接过来的时候注册一次读事件.

     已后就是在每次写完数据之后再去注册读事件.

 

2.注册写事件.

     每次处理过逻辑之后,注册写事件,然后把要返回的结果socketChannel.write(responseLineBuffer)写出去.

 

3.在读数据的时候注意.

 

 

 

 

//首先客户端发来的数据应该带有标示这次发送过来的数据大小.

int responseSize;

//读来的数据缓冲区.

ByteBuffer requestLineBuffer = ByteBuffer.allocate(1024);

  

*比如说客户端发过来1024个字节.这样的话正好 requestLineBuffer 一次读到1024个字节.这时 responseSize==requestLineBuffer里面数据的大小. 这正是你需要的完整数据.

 

*如果客户端发送过来100个字节.这时responseSize<requestLineBuffer里面数据的大小.这时你就需要判断当读到100个字节的时候就不要再往下读了,即使再读的话也是空数据.

 

前两种情况正是你所希望的,responseSize<=requestLineBuffer里面数据的大小.

 

*如果客户端发送过来2048个字节,第一次最多也就读1024个字节的数据.这时responseSize>requestLineBuffer,你就要判断如果第一次没有把数据读完整的话,还要再去把剩下的1024个字节的数读过来.

 

这种情况也许你已经想到了.但下面还有2种诡异的情况.

 

*如果客户端发送过来 2048 个字节,但是分2次或多次发送过来,比如说前两次读到 1548 个字节,这时你判断发现还没有接收到完整数据但再去用int count = socketChannel.read(requestLineBuffer);读,就是读不到数据.这样的话你就需要把这次读到的数据保存下来,再注册一个读的事件去读,等到下次把剩下的 500 个字节 数据读过来后再去处理逻辑.这样的情况就是socketChannel.read的数据并不是一次把数据读到的,而是分多次.

 

*最后一种情况就是 如果客户端发送过来 5000 个字节,但是每次请求的数据只有 1000 个字节,这说明客户端发送太快,或是服务器处理太慢,系统把这5次的请求的数据加到一起了.这时你就要把这5个请求一个一个的分别取出来一个一个的去处理相应的逻辑.

 

 

//注销写事件

key.interestOps(key.interestOps()&~SelectionKey.OP_WRITE);
//注销读事件

key.interestOps(key.interestOps()&~SelectionKey.OP_READ); 



key.cancel();

 

//客户端关闭判断. 

int count = socketChannel.read(requestLineBuffer);
if (count <= -1) {
    close();

 

 

 

Netty进行Socket编程(一) 一些基本概念 1 Socket 1) 同一个名词Socket有多种不同意思。 2) 在计算机网络知识体系中,运输层的TCP(传输控制协议)把连接作为最基本的抽象。TCP的连接有两个端点,被称为Socket,通过IP地址+端口号来区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。Client进程和Server进程之间是通过Socket读写数据进行通信的。 3) JDK的java.n 阅读详情

相关推荐

解密 vn.py 源码:从事件驱动到模块化设计的实战解析

本文深入解析vn.py源码,重点剖析其事件驱动机制与模块化设计。通过事件引擎、处理器字典等核心组件分析,展示如何实现低耦合高内聚的交易系统架构,并结合实战案例说明模块化设计带来的开发效率提升。文章还详细解读了Gateway抽象层、核心数据结构及设计模式应用,为量化交易开发者提供源码级实践指南。

weixin_27427619的博客 249

netty udp接收超过2048字节数据

默认netty udp接收DatagramPacket字节数最大是2048,如果数据大,超过这个限制,就会报错,抛出异常,虽然这个包解析失败,不会影响其他包的解析,但是总得来说,这种失败是不利于数据收集的。 我们先来看看这个错误: java.lang.IndexOutOfBoundsException: readerIndex(57) + length(2503) exceeds writerIndex(2048): PooledUnsafeDirectByteBuf(ridx:...

feinifi的博客 5257

Matcap与菲涅尔

菲尼尔效果(简化版公式):fresnel = base + scale*((1-v*n)^power)透明队列为后前渲染,不关闭深度写入则会覆盖之前的像素,导致混合不了。y的值为0~1,根据x3返回对应y值。两色混合做个demo看看!混合为什么要关闭深度写入?

weixin_62773441的博客 371

解决socket负载均衡集群方案和代码实现

有一段时间,在考虑下socket 之间集群 可以在Nginx 下可以 但是不同服务器之间怎么通讯呢 后来自己也想可不可以用什么东西或者中间件来通讯 ,后来在百度之下 发现果然就是按照我所想的 ,在网上看了一个方案,架构如下: 说一下这个方案他们之间的作用 redis : 存取用户和服务器的关系,如果A想发一条数据,是发给B ,这时A发起一个mq订阅模式推送的数据 ,然后B收到数据处理好 ,...

qq_20448967的博客 1万+

【Vite+Vue3+TS】基于Vite+Vue3+TypeScript+ESLint+Prettier+Stylelint搭建项目(亲测超详细)

结合了很多项目和文章,总结一篇项目构建的笔记。 温馨提示:文章末尾记录了我在搭建项目过程中,遇到的一些问题和解决办法 ~

aDiaoYa_的博客 4231

[南大ICS-PA2] 字符串处理函数和printf实现

[南大ICS-PA2] 程序、运行时环境与AM 字符串处理函数和printf实现

qq_42474104的博客 2985

Socket和NioSocket浅谈

Socket java中的网络通信是通过Socket实现的,之前说过TCP/IP协议只是一套规则,并不能具体工作,就像程序中的接口一样,而Socket是TCP/IP协议的一个具体的实现。Socket分为ServerSocket和Socket两大类,ServerSocket用于服务端,可以通过方法监听请求,监听到请求后返回Scoket,Socket用于具体完成数据传输,客户端直接使用Socket发...

Amaranth007的博客 5749

ElasticSearch 集群安全加固实战:从零配置TLS证书与密码认证

本文提供了一份详尽的ElasticSearch集群安全加固实战指南,重点介绍了如何从零开始配置TLS证书与用户安全认证。通过分步讲解证书生成、节点配置、集群重启及密码设置,帮助管理员为ES集群构建通信加密与访问控制的双重防线,有效提升数据安全性与合规性。

weixin_29323493的博客 444

socket服务部署到服务端后启动失败Cannot assign requested address: bind 的总结

    服务端项目用socketio-netty搭建的,项目本地测试没问题,但是部署到阿里云的服务器后,启动不了,报了如下错误:Caused by: java.net.BindException: Cannot assign requested address: bind at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_161] at sun...

asd1098626303的博客 3万+

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254

fastadmin管理员页面实现手机验证码登录功能-腾讯云短信插件

fastadmin管理员页面实现手机验证码登录功能-腾讯云短信插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4192

Hutool - Socket:让 Java Socket 编程不再复杂

各位开发者朋友们,在网络编程的世界里,Socket 编程可是一项基础且重要的技能。无论是实现简单的客户端 - 服务器通信,还是构建复杂的分布式系统,Socket 都扮演着关键角色。Java 本身提供了 NIO(Non - blocking I/O)和 AIO(Asynchronous I/O)来实现高性能的 Socket 编程,但使用原生 API 进行开发时,代码往往比较复杂,需要处理很多底层细节。

十年磨一剑,java开发各种业务系统 1429

Python在振动信号处理中的应用(一):振动信号消除多项式趋势项

文章目录一、概述二、最小二乘法去除趋势项原理三、python模块介绍3.1 scikitlearn简介(1)转化器(Transformer)(2)估计器(Estimator)3.2 线性回归LinearRegression3.3 多项式PolynomialFeatures3.4 工作流Pipeline四、python代码实现4.1 构造模拟信号4.2 编写去除趋势项主代码4.3 展示算法效果五、TIPS 一、概述   在振动测试过程中,传感器或采集设备由于自身性能问题或受环境干扰(如温度、供电等影响),容易

白银时代的博客 8578

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

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

猪大肠的博客 2722

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NIO实现非阻塞Socket编程

前言: 基于阿里面试时,面试官问我,我做的聊天项目里,考虑过性能没有,是怎么解决程序卡顿现象的,针对客户端,当在发送文件时,如果卡顿,怎么办,同时想聊天,当时程序我是基于多线程实现的,在客户端里,聊天时启动一个线程,传送文件时,启动另一个线程,所以在客户端并不会影响,面试官就说知道了,但是,针对服务器的性能优化,我做的不好,针对每一个客户端开启线程,造成服务器压力过大,因为现在没有上线,所以

小疯子的博客 1722

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

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

Socket(三) NIO

NIO主要包括两个部分: java.nio.channels包介绍了Selector和Channel抽象, java.nio包介绍了Buffer抽象 5.1为什么需要NIO(单线程实现Socket多线程的效果) 考虑一个在客户端之间传递消息的即时消息服务器(Instant Messaging)。客户端必须不停地连接服务器以接收即时消息,因此线程池的大小限制了系统可以同时服务的客户端总数。如...

gk 439

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java NIO Socket 多线程

Java NIO Socket 多线程 欢迎使用Markdown编辑器IO模型介绍Java NIO的工作原理NIO 三大基本组件ChannelBufferSelectorNIO 代码实现服务端普通客户端多线程NIO 注意事项 欢迎使用Markdown编辑器 java NIO SocketChannel,非阻塞多线程模式应用。 IO模型介绍 1. 阻塞IO 如果数据没有准备就绪,就一直等待,直...

sjzjibixi的博客 1149

Java网络编程原理与实践--从Socket到BIO再到NIO

本文首先介绍了Socket,给出了几个实例多角度的感受Socket使用,基于Socket的问题提出BIO,但是BIO只能解决部分问题,同时会有资源泄露问题,由此给出NIO的基本组件和使用。

Artisan_w 1854

NIO:非阻塞Socket的理解

java nio socket相较于传统socket主要优势就是“非阻塞”。这里针对java初学者谈一下nio非阻塞机制的粗略原理,帮助理解和学习。 首先要说明的是,nio socket并非100%取消了阻塞,该阻塞还是要阻塞,只是它允许程序以更高效的方式来阻塞。 传统socket编程的服务器端主要代码是: new ServerSocket(8888).accept(); 这个ac...

u010990854的博客 454

java nio socket 例子_Java Socket NIO示例总结

Java NIO是非阻塞IO的实现,基于事件驱动,非常适用于服务器需要维持大量连接,但是数据交换量不大的情况,例如一些即时通信的服务等等,它主要有三个部分组成:ChannelsBuffersSelectorsChannel有两种ServerSocketChannel 和 SocketChannel,ServerSocketChannel可以监听新加入的Socket连接,SocketChannel用...

weixin_34520360的博客 186

java socket客户端 nio_Java Socket NIO

服务端:public classNIOServer {private static final String HOST = "localhost";private static final int PORT = 10086;public static voidmain(String[] args) {ServerSocketChannel serverSocketChannel= null;Ser...

weixin_29924309的博客 294

手写JAVA NIO实现Socket通信及其过程中注意的问题

当然现在不需要自己手写NIO实现socket,都是在需要建立TCP/IP连接的程序中直接使用mina框架,或者netty框架, 后者使用的更多。本文仅仅是手写NIO,找一找学习NIO中遇到的问题,以及在调试的过程中学习对某些API的理解,文中只写了服务端,客户端用SocketTools这个工具充当,测试。

ccityzh的博客 2123

java socket客户端 nio_NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】...

1.前言以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 ,优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作,还可以做socket通信 、收发UDP包、Pipe线程单向数据连接。这一篇随笔专门讲解 NIO socket通信具体操作注意:这是重点!!!兴趣集合有4个事件,分别是:SelectionKey.OP_ACCEPT ...

weixin_36295555的博客 1236

JAVA NIO TCP SOCKET 聊天群发

以前都是用一般的socket编程,用线程来控制。最近突然用nio来做些东西。 nio的好处我来说一下:第一,读写都是基于块的,效率高。第二,通过引入selector,简化了网络编程模型,异步非阻塞。 既然有这么多好处,那就写个NIO TCP网络聊天室来练练手吧。 因为没有写gui,是基于控制台的所以没写私了的部分,只写了公共聊天室。(其实,既然是服务器端可以分发给所有人,分

mcastle888的专栏 2003

Netty之NIO

空转”指的是:Selector 频繁触发写事件,但你没有实际业务要处理(即没有数据需要写),这会造成CPU 空耗,浪费资源。本质上就是:写事件一直在通知你,但你啥也不用干,程序在“白忙活”。

qq_45101876的博客 1869
上一篇: 基于事件的NIO多线程服务器
下一篇: 最近项目中用的flash与java通讯的几种方式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值