简书上的大牛总结的 ServerSocket Accept() 的确是阻塞方法 与猜想一致 一些理解 转载如下

HDFView安装及使用教程 简介:直接用记事本打开hdf5文件的话,是一团乱码。HDFView是用来查看hdf5文件的软件,可以免费使用,好多人都有闪退的情况,这是因为没有添加环境变量。 阅读详情

 

当我们调用如下代码的时候,实际java封装了很多层调用

 

图1

new ServerSocket(9876) 这个构造函数的内部,会调用 bind() 以及 listen() 等系统调用,之后才是 accept(),下面依次讲解。

bind(): bind 只是简单的将套接字和 地址端口联系上,调用bind()之后,netstat 不会看到任何连接

listen(): listen 表示此套接字 已经处于监听状态了,外部请求可以打进来了。

 

 

图2

 

可以看到,并没有运行到 accept() ,socket已经处于监听状态了,那此时如果外部连接打进来会怎样呢?我们用浏览器模拟http请求。 打开 chrome 输入 127.0.0.1:9876 回车,

 

图3

可以看到 55870 端口建立了连接 (ESTABLISHED 表示连接已经建立)  (55868那个端口不知道怎么来的,有知道的大神希望能指点一下)。然后我们在浏览器多开几个窗口输入,会发现连接建立的更多了。

 

图4

所以,listen的时候,是可以接收请求并建立连接的,只是不处理这个socket的内容而已。参考UNIX网络编程(卷一,套接字联网API 第三版 p85),此时系统维护两个队列,未完成建立连接队列(三次握手只进行了第一步)和 已完成建立连接队列(上述ESTABLISTHED的连接)。而之后的 accept() 会在已建立连接队列获取套接字来处理。

accept() :会从上述已建立连接套接字队列,获取队列头部的socket,来进行处理,每次accept()都会返回一个对应客户端的全新socket 。当建立连接队列为空时,accept会阻塞并处于睡眠状态。

另注:当accept() 之后,如果一个请求打过来,服务器处理请求之后,并不会将连接中断,而是会一直通过 客户端的 keepAlived 来维持这个连接

 

图4

可以看到  都是从客户端发送的 keepalived 请求,服务端回应ack。

补充一下:在listen之前,创建的socket都默认为要主动 connect 其他服务的,即为主动socket,只有listen 之后,socket 才变为被动的。服务端的socket 都是listen了之后,才变为服务socket的。



作者:熊哥的世界
链接:https://www.jianshu.com/p/64ca562f156a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

https://www.jianshu.com/p/64ca562f156a

Linux安装部署PostgreSQL详细步骤 阅读详情

相关推荐

matlab 三维绘图 抛光,瓷砖抛光过程建模与仿真

:瓷砖抛 光过程 建模与仿真朱 成 就(广 东工业大学 机 电工程 学院, 广东广州 )摘要 :瓷砖的抛磨影响 因素众 多 ,实际磨削加工时容易出现漏抛 、返抛现象 。对陶瓷抛光机磨头进行运动学分析 ,并基于不 同粒度号 的磨 粒在一定压力下的加工深度模型 ,探讨抛光机磨 头转 速 、横梁摆动频率 、传送速度对瓷砖抛光加工表 面均匀性 的影响,然 后结合 磨削机理使 用 对陶瓷抛光过程进行仿真 ...

weixin_36331058的博客 747

ServerSocket 用法详解

<br />在客户/服务器通信模式中,服务器端需要创建监听特定端口的ServerSocket,ServerSocket负责接收客户连接请求。本章首先介绍ServerSocket类的各个构造方法,以及成员方法的用法,接着介绍服务器如何用多线程来处理与多个客户的通信任务。<br />本章提供线程池的一种实现方式。线程池包括一个工作队列和若干工作线程。服务器程序向工作队列中加入与客户通信的任务,工作线程不断从工作队列中取出任务并执行它。本章还介绍了java.util.concurrent包中的线程池类的用法,在服

Mr. David 专栏 3128

手把手教你用Alinx黑金开发板(Spartan-6)驱动ADF4351信号源(附Verilog SPI代码)

本文详细介绍了如何使用Alinx黑金开发板(Spartan-6 FPGA)驱动ADF4351信号源,包括硬件连接、Verilog SPI代码实现及系统调试。通过实战指南,帮助开发者快速掌握FPGA控制ADF4351芯片的技术,适用于射频信号源设计和学习应用。

weixin_30335575的博客 628

ServerSocket

ServerSocket的构造方法有以下几种重载形式: ServerSocket()throws IOException ServerSocket(int port) throws IOException ServerSocket(int port, int backlog) throws IOException ServerSocket(int port, int backlog, In...

iteye_10403的博客 841

dbt+Snowflake实战:数据建模、权限隔离与性能优化全指南

dbt(data build tool)作为现代数据栈的核心建模工具,其与Snowflake的深度协同远不止于SQL编译执行——它本质是将软件工程实践(如版本控制、测试驱动、CI/CD)注入数据交付流程。理解dbt的声明式建模原理与Snowflake的虚拟仓库、Time Travel、TRANSIENT表、聚簇键等底层机制如何咬合,是实现可维护、可审计、低成本数据产品交付的关键。本文聚焦dbt在Snowflake环境中的真实落地挑战,涵盖schema与warehouse的物理映射设计、role级硬隔离策略、

weixin_34389926的博客 312

【入坑存内计算一键指南】存内计算运算原理:算法优化、存储介质探究

本文探讨了存内计算及其面向的架构优化,尤其侧重于图算法优化和存内计算存储介质。文章介绍了存内计算的概念和意义,着重强调了存内计算解决了内存墙问题,提高了计算效率。针对图算法的优化,提出了基于位运算的创新方法,重塑了单源最短路径算法,并介绍了基于局部重叠度的链路预测算法优化设计。接着,文章详细讨论了存内计算存储介质,特别是非易失性存储器,比较了不同类型存储器的性能,并重点介绍了基于ReRAM的存内计算技术,包括其物理模型和交叉阵列结构。

一键难忘的博客 7065

ServerSocket类的使用

接受accept与超时Timeout public Socket accept()方法的作用就是侦听并接受此套接字的连接。此方法在连接传入之前一直阻塞。 setSoTimeout(timeout)方法的作用是设置超时时间,通过指定超时timeout值启用/禁用SO_TIMEOUT,以ms为单位。在将此选项设为非零的超时timeout值时,对此ServerSocket调用accept()方法将只阻塞timeout的时间长度。如果超过超时值,将引发java.net.SocketTimeoutException,

吴声子夜歌的博客 2920

【Burp入门第三十七篇】AutoRepeater插件安装使用教程+越权实战案例

AutoRepeater 通过接收满足特定条件的请求,按照预设的基础替换规则对请求进行处理。在接收到匹配请求后,它首先应用基础替换,然后针对每个定义的替换创建请求副本并应用该替换操作,从而实现对不同参数的修改和请求的重复发送,以此来全面检测 Web 应用的授权情况。1、自动化请求重复:能自动复制、修改并重发 HTTP 请求,避免了手动重复操作的繁琐,大大提高了 Web 应用授权测试的效率。2、灵活参数替换:可灵活改变邮箱地址、账号身份、角色、URL 和 CSRF 令牌等关键参数。

等风来 2034

java accept方法_java – ServerSocket accept()方法

谁知道当我使用ServerSocket类的accept方法时如何选择端口?是否可以为方法可以选择的端口定义范围?我可以按顺序逐个接收端口吗?ServerSocket sSocket = new ServerSocket(5050);Socket socket = sSocket.accept();解决方法:该图表不正确(并列在O’Reilly网站上的unconfirmed errata中).客户端...

weixin_28750421的博客 3456

5、数字图像采集:X射线成像技术全解析

本文全面解析了数字图像采集中的X射线成像技术,涵盖数字X射线探测器、荧光透视与血管造影、乳腺摄影以及计算机断层扫描(CT)的图像重建原理。详细介绍了TFT平板探测器的优势、DSA技术在血管成像中的应用、乳腺摄影对高对比度和分辨率的需求,以及CT中基于Radon变换和滤波反投影的重建方法。同时探讨了噪声、部分容积效应、金属伪影和运动伪影等常见问题及其影响。最后总结了各类X射线成像技术的特点与应用场景,并展望了未来在图像质量提升和剂量优化方面的技术发展方向。

l6m7n8的博客 126

一层一责,一聚合一包:DDD分层架构下的微服务代码模型、三重边界与服务数据协作

领域模型画得再清楚,落不进代码也是空谈。本文以一个可运行的客户中心微服务为线索,先对比整洁架构、六边形架构与DDD分层架构,指出三者共同守护的那条隔离核心业务的红线;再把DDD分层落成四个一级目录、以聚合为单位分包、一个聚合一个仓储的代码模型,拆解实体、聚合根、值对象、领域事件、领域服务与仓储的设计要点;随后厘清逻辑、物理、代码三重边界,并用检查器实测:干净代码零越界,拆出积分聚合时领域代码无需改动;注入九处越界后,必须先重构才能拆分。最后梳理服务调用三场景与PO、DO、DTO、VO的协作。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 177万+

ServerSocket和Socket连接

文章目录概述:Socket和浏览器通信连接和通信Socket保持连接通信 概述: ServerSocket类 TCP协议,服务器端,通过serveSocket.accept();方法获取socket实例 Socket类 TCP协议 通过new Socket()获取实例,创建Socket对象的时候则需要声明一个IP地址和ServerSocket对象的端口号,这样才能对服务端发出连接请求 客户端上的使用 1.getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputS

The blog of 优快云 in 杨天福 1892

Linux ARM平台开发系列讲解(网络篇)1.3 MDIO总线设备device和设备driver匹配

在设备和驱动都载入内核后,设备和驱动是如何匹配起来的呢?其实他们就是通过的唯一标识phyID进行匹配phy_dev和phy_drv是通过phy_bus_match函数进行匹配,匹配成功后会建立链表链接,具体流程如下图: 返回总目录......

DSMGUOGUO的博客 1098

网络编程socket accept函数的理解

在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求。这个套接字不能用于与客户端之间发送和接收数据。 accept()接受一个客户端的连接请求,并返回一个新的套接字。所谓“新的”就是说这个套接字与socket()返回的用于监听和接受客户端的连接请求的套接字不是同一个套接字。与本次接受的客户端的通信是通过在这个新的套接字上发送和接收数据来完成的。 再次调用accept()可以接受下一个客户端的连接请求,并再次返回一个新的套接字(与socket()返回的套接字、

m0_67392273的博客 1695

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Socket socket=serverSocket.accept() - 建立连接后的套接字

accept() 服务器接受客户端的连接请求,并返回一个套接字,客户机通过此套接字与服务器通信。 如果未连接到客户端,线程处于阻塞状态,程序无法执行下去。 一个服务器可以接受多个客户端的连接请求,但其只为第一个已连接套接字服务,只与第一个客户端通信,不会与其他的客户端交互。 如果要为多个客户端服务,让服务器接收的客户端请求(Socket socket=serverSocket.accept())处于循环中,就相当于有n个服务器,这样就可以与n个客户端通信。 如: public class MultiServ

weixin_43516406的博客 3742

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

socket编程

socket编程 网络字节序 小端法: 高位存在高地址, 低位存在低地址(计算机本地采用); 大端法: 高位存在低地址, 低位存在高地址(网络通信采用); 调用库函数做网络字节序和主机字节序的转换; #include<arpa/inet.h> uint32_t htonl(uint32_t hostlong); //主要针对IP uint16_t htons(uint16_t hostshort); //主要针对port uint32_t ntohl(uint32_t netlon

qq_38966867的博客 274

efm32 入门.pdf

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

java网络编程精解_Java网络编程精解之ServerSocket用法详解三(3)

ServerSocket的accept()方法从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回。如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回。SO_TIMEOUT选项表示ServerSocket的accept()方法等待客户连接请求的超时时间,以毫秒为单位。如果SO_TIMEOUT的值为0,表示永远不会超时,这是SO_...

weixin_39639643的博客 735

Java网络编程精解之ServerSocket用法详解二1

3.6  创建多线程的服务器在本书第1章的1.5.1节的例程1-2的EchoServer中,其service()方法负责接收客户连接,以及与客户通信。service()方法的处理流程如下: while (true) {Socket socket=null;try {socket = serverS

KEVIN_LONG的专栏 1714

socket 的阻塞模式和非阻塞模式

在应用程序 A 与 应用程序 B 建立了 TCP 连接之后,假设应用程序 A 不断调用 send 函数,这样数据会不断拷贝至对应的内核缓冲区中,如果 B 那一端一直不调用 recv 函数,那么 B 的内核缓冲区被填满以后,A 的内核缓冲区也会被填满,此时 A 继续调用 send 函数会是什么结果呢?上面的示例验证了如果一端一直发数据,而对端应用层一直不取数据(或收取数据的速度慢于发送速度),则很快两端的内核缓冲区很快就会被填满,导致发送端调用 send 函数被阻塞。

qq_41854911的博客 6046

Socket学习2

2.1接收和关闭与客户端的连接 ServeSocket的accept()方法从连接请求队列中取出一个与客户端的连接,然后创建于客户端连接Socket对象,并将它返回。如果队列中没有连接请求,accept()方法就一直等待 ,直到接收到连接请求才返回。         接下来,服务器从Socket对象中获得输入流和输出流,就能与客户交互数据。当服务器正在进行发送数据的操作时,如果客户端断开了连

jiangtao7913的博客 546

java网络IO

服务器端也是如此,在处理某个客户端A发来的请求时,另一个客户端B发来的请求会等待,直到服务器端的处理线程线程上一个请求的处理。同步和非同步是操作系统级别的,主要描述操作系统在收到程序请求网络IO操作后,如果网络IO资源没有准备好,该如何响应程序。同一时间,服务器只能接收一个客户端的请求信息,第二个客户端需要等待服务器接收完第一个请求数据后才会被接收。阻塞和非阻塞是程序级别的,主要描述程序请求操作系统IO操作后,如果网络IO资源没有准备好,程序如何处理。同步IO不响应程序,直到网络IO资源准备好。

Lxn2zh的博客 460

Socket编程

Socket 编程是网络通信的核心,下面阐述TCP 协议下服务端和客户端的编程步骤。

hxltech的专栏 976

如何解决TCP协议中serverSocket.accept()阻塞和读取类inputstream.read(byte[] byte0)函数的阻塞问题?

在写一个简单的后台服务项目的时候,遇到底层客户端端WiFi模块断线,而导致1.服务程序跑飞,2.线程内存不能合理释放; 标题1.解决inputstream.read(byte[] byte0)函数的阻塞 ,下面是才开始时的代码. ``` ss = new ServerSocket(10086); System.out.println("=============S...

weixin_42353390的博客 5166

tomcat 服务器抛出socket异常“文件打开太多”的问题(转)

转自:http://www.blogjava.net/tufanshu/archive/2006/07/31/60981.html 最近,运行的tomcat服务器在正常运行将近2个月后,抛出如下错误: 警告: Reinitializing ServerSocket 2006-7-28 15:07:40 org.apache.tomcat.util.net.PoolTcpEndpoin

wangqianjiao的专栏 4732

关于CentOS7中配置服务IO操作文件柄数过多问题

背景 有一个服务使用到了使用Java实现对线上数据库进行备份,是一个定时任务,一切准备就绪,等第二天起来看的时候,发现服务挂了。。。 日志提示信息 2021-09-13 03:00:00.002-[scheduling-1] ERROR com.personloger.utils.BackUpDataBaseManager [BackUpDataBaseManager.java:91] - An I/O exception occurs when the database is backed up | ex

TomPig_1024 477

java对ServerSocket和Socket的简单理解

一、ServerSocket ServeSocket负责客户端的接收,并生成客户端的连接请求 1、构造方法 ServerSocket()throws IOException //绑定到服务器上的任意一个可用的端口 ServerSocket(int)throws IOException //绑定服务器上指定的端口 ServerSocket(int, int)throws IOException //绑定到服务器山指定的端口并且指定客户端请求的长度(当客户端等待连接的队列达到设定的容量的时...

qq_38345598的博客 829
上一篇: 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制
下一篇: newcachedthreadpool用法
火星种萝卜
博客等级 码龄19年 438粉丝 304原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值