Java 网络编程 —— ServerSocket 详解

构造 ServerSocket

ServerSocket 的构造方法有以下几种重载形式

ServerSocket() throws IOException
ServerSocket(int port) throws IOException
ServerSocket(int port, int backlog) throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException

参数 port 指定服务器要绑定的端口(即服务器要监听的端口),参数 backlog 指定客户连接请求队列的长度,参数 bindAddr 指定服务器要绑定的 IP 地址

1. 绑定端口

除了第 1 个不带参数的构造方法,其他构造方法都会使服务器与特定端口绑定,由参数 port 指定,无法绑定则抛出 IOException,一般是因为端口已经被其他服务占用,或者没有足够的权限去绑定

如果把参数 port 设为 0,则表示由操作系统为服务器分配一个任意的可用端口,也被称为匿名端口。对于多数服务器,会使用明确的端口,而不会使用匿名端口,因为客户程序需要事先知道服务器的端口,才能方便地访问服务器

ServerSocket(int port) throws IOException

2. 设定客户连接请求队列的长度

当服务器进程运行时,可能会同时监听到多个客户的连接请求,管理客户连接请求的任务是由操作系统来完成的。操作系统把这些连接请求存储在一个先进先出的队列中,许多操作系统都限定了队列的最大长度,一般为 50。当队列中的连接请求达到了队列的最大长度时,服务器进程所在的主机会拒绝新的连接请求,只有当服务器进程通过 ServerSocket 的 accept() 方法从队列中取出连接请求,使队列腾出空位,队列才能继续加入新的连接请求

ServerSocket 构造方法的 backlog 参数用来显式设置连接请求队列的长度,它将覆盖操作系统限定的队列的最大长度。值得注意的是,在以下几种情况中,仍然会采用操作系统限定的队列的最大长度:

  • backlog 参数的值大于操作系统限定的队列的最大长度
  • backlog 参数的值小于或等于 0
  • 在 ServerSocket 构造方法中没有设置 backlog 参数

3. 设定绑定的 IP 地址

ServerSocket 的第 4 个构造方法有个 bindAddr 参数,它显式地指定服务器要绑定的 IP 地址,适用于具有多个 IP 地址的主机


接收和关闭与客户的连接

ServerSocket 的 accept() 方法从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的 Socket 对象,井将它返回。如果队列中没有连接请求,accept() 方法就会一直等待下去。接下来,服务器从 Socket 对象获得输入流和输出流,就能与客户交换数据了

以下代码展示了单线程服务器采用的通信流程

public void service() {
	while (true) {
        Socket socket = null;
        try {
            // 从连接请求队列中取出一个连接
            socket = serverSocket.accept();
            System.out.printin("New connection accepted " + socket,getInetAddress() + ":" + socket.getPort());
            //接收和发送数据
            ...
        } catch (IOException e) {
            // 这只是与单个客户通信时遇到的异常,可能是由于客户端过早断开连接引起的
            // 这种异常不应该中断整个while循环
            e.printStackTrace();
        } finally {
            try {
                // 与一个客户通信结束后,要关闭Socket
                if(socket != null) socket.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

关闭 ServerSocket

ServerSocket 的 close() 方法使服务器释放占用的端口,并且断开与所有客户的连接

ServerSocket 的 isClosed() 方法判断 ServerSocket 是否关闭,只有执行了 ServerSocket 的 close() 方法,isClosed() 方法才返回 true,否则即使 ServerSocket 还有没有和特定端口绑定,该方法也会返回 false

ServerSocker 的 isBound() 方法判断 ServerSocket 是否已经与一个端口绑定,只要 ServerSocket 已经与一个端口绑定,即使它已经被关闭,该方法也会返回 true

如果需要判断一个 ServerSocket 是否已经与特定端口绑定,并且还没有被关闭,则可以采用以下方式

boolean isOpen = serverSocket.isBound() && !serverSocket.isClosed();

获取 ServerSocket 的信息

ServerSocket 的以下两个 get 方法分别用于获得服务器绑定的 IP 地址,以及绑定的端口

public InetAddress getInetAddress()
publlc int getLocalPort()

ServerSocket 选项

1. SO_TIMEOUT

表示 ServerSocket 的 accept() 方法等待客户连接的超时时间,以 ms 为单位。如果 SO_TIMEOUT 的值为 0 则表示永远不会超时,这是 SO_TIMEOUT 的默认值

public void setSoTimeout(int timeout) throws SocketException
public int getSoTimeout() throws IOException

2. SO_REUSEADDR

这个选项与 Socket 的 SO_REUSEADDR 选项相同,决定如果网络上仍然有数据向旧的 ServerSocket 传输,那么是否允许新的 ServerSocket 绑定到与旧的 ServerSocket 同样的端口

public void setResuseAddress(boolean on) throws SocketException
public boolean getResuseAddress() throws SocketException

3. SO_RCVBUF

表示服务器端的用于接收数据的缓冲区的大小,以字节为单位

public void setReceiveBufferSize(int size) throws SocketException
public int getReceiveBufferSize() throws SocketException

4. 设定连接时间、延迟和带宽的相对重要性

该方法的作用与 Socket 的 setPerformancePreferences() 方法的作用相同


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/17061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion使用方法

SD的本地安装教程有很多我就不重复了,这里主要是记录我在使用SD Webui的过程中遇到的问题,总结的一些提升出图效率,出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 ? Ok,以上只是一小部分成品 ,属…

PyQt5桌面应用开发(6):文件对话框

本文目录 PyQt5桌面应用系列介绍QFileDialog的静态接口QFileDialog的对象接口 示例结论后记 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件循环 PyQt5桌面应用开发&#xff…

MRI k空间概念整理

以下内容为MRI期末复习笔记,仅供复习参考使用。 K空间概念 K空间为包含MR数据的阵列,也可定义为原始数据阵列相位编码轴和频率编码轴的交叉点 MR扫描得到的数据为谱空间数据,谱空间数据与空间数据位置无直接对应关系 k空间每一数据点或数据…

不能使用chatGPT?这3个平替甚至比chatGPT更强

不能使用chatGPT?这3个平替甚至比chatGPT更强 chatGPT,一款由OpenAI开发的新型AI聊天机器人,正在势如破竹地改变着许多人的工作和生活方式。作为一款基于大语言模型的聊天机器人,chatGPT能够理解自然语言并进行人机对话。与传统的…

用于scATAC-seq有监督分类的Cellcano

细胞类型识别是单细胞数据分析的基本步骤。由于高质量参考数据集的可用性,有监督细胞分类方法在scRNA-seq数据中很受欢迎。染色质可及性分析(scATAC-seq)的最新技术进步为理解表观遗传异质性带来了新的见解。随着scATAC-seq数据集的不断积累&…

html5地理位置信息介绍, 百度地图使用

文章目录 1. HTML5中地理信息API1.1 Geolocation 接口 2. 在vue中使用百度地图3. 在react中使用百度地图 1. HTML5中地理信息API HTML5 的地理位置 API 可以让你获取用户的地理位置信息,并将其用于许多不同的应用场景,例如: 在地图上显示用…

钴基双金属氧化物储能材料的高效制备和电化学应用

一、引言 钴金属氧化物作为一类典型的储能材料,既可以用于锂离子电池负极材料,又可以用于超级电容器电极材料,因而备受关注 。在作为锂离子电池负极材料时,具有较高的理论比容量,但充放电体积变化较大、材料导电性较差…

爬虫为什么需要ip

爬虫需要使用爬虫ip主要是为了解决以下问题: 1、反爬虫机制:许多网站会设置反爬虫机制来防止爬虫程序的访问,例如限制IP地址的访问频率、检测访问来源等。使用爬虫ip可以绕过这些限制,使得爬虫程序更难被检测到。 2、访问限制&a…

浅拷贝和深拷贝

浅拷贝: 定义:浅拷贝(Shallow Copy)是一种简单的对象复制方式,将一个对象的数据成员直接复制给另一个对象(通常是通过默认的复制构造函数或赋值运算符实现),这些数据成员可以是基本…

JavaScript:字符串

文章目录 字符串344. 反转字符串reverse() 方法(打基础的时候,不要太迷恋库函数)代码及思路 541. 反转字符串 IIJavaScript String split() 方法JavaScript Array join() 方法代码分析见注释 剑指 Offer 05. 替换空格思路注意:上面…

网络基础学习:什么是网络与网络发展史

什么是网络与网络发展史 什么是网络?什么是网络发展史?分组交换技术TCP/IP技术Web技术ARPANET(1969年)Internet(1983年)万维网(1990年)移动互联网(2007年)物联…

KDGK-F断路器机械特性测试仪

一、产品概述 KDGK-F 断路器机械特性测试仪可用于各电压等级的真空、六氟化硫、少油、多油等电力系统高压开关的机械特性参数测试与测量。测量数据稳定,抗干扰性强,可在500KV等级及以下电站做实验,接线方便,操作简单,是…

第14章 项目采购管理

文章目录 采购管理包括如下几个过程14.2 编制采购计划 462编制采购计划的输出1)采购管理计划2)采购工作说明书3)采购文件 14.2.3 工作说明书(SOW) 14.3 实施采购 47414.3.2 实施采购的方法和技术 476(1&…

No.054<软考>《(高项)备考大全》【冲刺8】《软考之 119个工具 (6)》

《软考之 119个工具 (6)》 99.应急应对策略:100.风险在评估:101.风险审计:102.偏差和趋势分析:103.技术绩效测量:104.自制或外购分析:105.市场调研:106.投标人会议:107.建议书评价技术:108.独立核算:109.广告:110.采购谈判:111.合同变更控制系统:112.采购…

ArduPilot之GPS Glitch问题M8N模块配置

ArduPilot之GPS Glitch问题&M8N模块配置 1. 源由2. 现象3. 视频分析3.1 配置(不理想)3.2 配置优化3.3 优化配置短时间3D LockGlitch3.4 优化配置长时间3D DGPS Lock3.5 使用尽量多的卫星系统3.5.1 配置一3.5.2 配置二 3.6 同一时间段(M8N…

3.3 泰勒公式例题分析

例1 写出函数f(x)带有拉格朗日余项的n阶麦克劳林公式 我的答案: 一、信息 1.f(x)的表达式 2.目标求这个f(x)的n阶麦克劳林公式 二、分析 条件1:告诉我f(x)的表达式为我后续带入公式做准备 条件2:告诉我用什么公式和此次求解的方向 三…

平面设计师都在用的设计素材网站,免费下载~

很多新手设计师不知道去哪里找高清、免费的设计素材,今天我就给大家推荐5个设计素材网站,免费下载,赶紧收藏起来把! 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站,主要是站内素…

普通2本,去过字节外包,到现在年薪25W+的测试开发,我的2年转行心酸经历...

个人简介 我是一个普通二本大学机械专业毕业,17年毕业,19年转行,目前做IT行业的软件测试已经有3年多,职位是高级测试工程师,坐标上海… 我想现在我也有一点资格谈论关于转行这个话题;希望你在决定转行之前…

unity-VRTK-simulator开发学习日记2(抛物线 导包|使用|调用方法)

导包 使用抛物线 1.层级目录下添加抛物线曲线 曲线上面那个是直线 2.将跟踪控制器 给到抛物线的“跟随资源” (选择哪只手射出射线) 3.激活按键 找到模拟手柄按键 找到simulator的交互的几个按键(ButtonOne为例) value&#x…

从4k到42k,软件测试工程师的涨薪史,给我看哭了

清明节一过,盲猜大家已经无心上班,在数着日子准备过五一,但一想到银行卡里的余额……瞬间心情就不美丽了。 最近,2023年高校毕业生就业调查显示,本科毕业月平均起薪为5825元。调查一出,便有很多同学表示自己…