Socket(六)

news2025/4/5 15:07:20

文章目录

    • 1. 构造服务器Socket
    • 2. 构造但不绑定端口
    • 3. 获得服务器Socket的有关信息
    • 4. Socket选项
    • 5. SO_TIMEOUT
    • 6. SO_REUSEADDR
    • 7. SO_RCVBUF
    • 8. 服务类型

1. 构造服务器Socket

有四个公共的ServerSocket构造函数

public ServerSocket(int port) throws BindException, IOException
public ServerSocket(int port, int queueLength) throws BindException,IOException
public  ServerSocket(int port,int queueLength,InetAddress bindAddress) throws IOException
public  ServerSocket() throws IOException

这些构造函数可以指定端口了、保存入站连接请求所用的队列的长度,以及要绑定的本地网络接口。它们所做的工作几乎是一样的,只是有些方法会使用队列长度和绑定地址的默认值。如果试图将队列长度设置为大于操作系统的最大队列长度,则会使用最大队列长度。默认地,如果不指定绑定的地址,且一个主机有多个网络接口和IP地址,服务器Socket会在所有接口和IP地址的指定端口上监听。如果指定本地IP地址,就会绑定这个IP地址。如果这三个构造函数的端口传入0,则操作系统会帮你选择端口 。

下面的代码的作用是查找可用的本地端口(哪些端口不可用)

public static void main(String[] args) {
        for (int i = 1; i <= 65535; i++) {
            try{
                ServerSocket serverSocket=new ServerSocket(i);
            }catch (IOException e){
                System.out.println("There is a server on port:"+i+".");
            }
        }
    }

在这里插入图片描述

2. 构造但不绑定端口

无参数构造函数会创建一个ServerSocket对象,但未将它具体绑定到某个端口,所以初始时它不能接受任何连接。以后可以用bind来进行绑定。

public void bind(SocketAddress endpoint) throws IOException
public void bind(SocketAddress endpoint, int ququeLength) throws IOException

这个特性的主要用途是,允许程序在绑定端口之前设置服务器socket选项,有些选项在服务器socket绑定后必须固定,一般模式如下:

ServerSocket ss=new ServerSocket();
SocketAddress http=new InetSocketAddress(80);
ss.bind(http);

也可以为SocketAddress传入null来选择任意端口,这与其他构造函数中为端口传入0的作用相似。

3. 获得服务器Socket的有关信息

ServerSocket类提供了两个获取方法,可以指出这个服务器Socket占用的本地地址和端口。

//返回服务器(本地主机)使用的地址
public InetAddress getInetAddress()
//返回服务器(本地主机)监听的端口
public int getLocalPort()
    public static void main(String[] args) {
        try{
            ServerSocket server=new ServerSocket(0);
            System.out.println("This server runs on port "+server.getLocalPort());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述
如果ServerSocket没有绑定到某个端口,则getLocalport()返回返回-1,与大多数Java对象一样,还可以使用toString()方法打印一个ServerSocket。
在这里插入图片描述

4. Socket选项

Socket选项指定了ServerSocket类所依赖的原生Socket如果发送和接受数据。对于服务器Socket,Java支持以下3个选项。

  • SO_TIMEOUT
  • SO_REUSEADDR
  • SO_RCVBUF

另外还允许你为Socket的数据包设置性能首选项。

5. SO_TIMEOUT

该选项是accept()在抛出java.io.InterruptedIOException异常前等待入站连接的时间,以毫秒算。如果该选项设置为0,accept就永远不会超时。这个默认值的作用就是永不超时。如果你想操作这个字段,可以使用到下面的函数:

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

调用accept函数时开始计时,如果超时会抛出一个SocketTimeoutException,这个IOException的子类。

6. SO_REUSEADDR

服务器Socket的SO_REUSEADDR选项与客户端Socket的SO_REUSEADDR选项非常类似。它确定了是否允许一个新的Socket绑定到之前使用过的一个端口,而此时可能还有一些发送到原Socket的数据正在网络上传输。有两个方法可以分别获取和设置这个选项;

public boolean getReuseAddress() throws SocketException
public void setReuseAddress(boolean on)throws SocketException

7. SO_RCVBUF

该选项设置了服务器Socket接受的客户端Socket默认接受缓存区的大小。这个缓存区可以由以下两个方法读/写:

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

设置一个服务器的SO_RCVBUF就像在accept()返回的各个Socket上调用setReceiveBufferSize()。这个选项为流中各个IP数据包的大小给出一个建议值。更快的连接可能希望使用更大的缓冲区,不过大多数情况下默认值就足够了。可以在绑定服务器Socket之前或之后设置这个选项,除非你想设置一个大于64KB的接收缓冲区大小。在这种情况下,必须在绑定之前,为未绑定的ServerSocket设置这个选项。

8. 服务类型

不同的Internet服务类型有不同的性能要求。例如,体育运动的直播视频要相对较高的的带宽,另一方面,电影可能仍需要高带宽,但可以接受较大的延迟。TCP定义了4个通用业余流类型:

  • 低成本
  • 高可靠性
  • 最大吞吐量
  • 最小延迟

可以为一个给定的Socket请求这些业务流类型。例如可以请求低成本时可用的最小延迟。这些度量都是模糊的,而且是相对的,不能作为服务保证,并不是所有路由器和原生TCP栈都支持这些业务流类型。对于服务器所接受的Socket,setPerformancePreferences()方法描述了为其连接时间、延迟和带宽给定的优先级:

public void setPerformancePreferences(int connectionTime, int latency,int bandwidth)

例如,通过将connectionTime设置为2,latency设置为1,bandwidth设置为3,这表示最大带宽是最重要的特性,最小延迟最不重要,连接时间居中:

socket.setPerformancePreferences(2,1,3)

至于给定的VM究竟如何实现,则取决于具体的Socket实现,底层Socket实现不要求考虑这些需求。它们只是为TCP栈提供了所需策略的一个提示。很多实现会完全忽略这些值。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第33步 机器学习分类实战:误判病例分析

填最后一个坑&#xff0c;如何寻找误判的病例。 之前我们在介绍AUC的时候&#xff0c;提到了两个函数&#xff1a;predict和predict_proba&#xff0c;复习一下&#xff1a; auc_test roc_auc_score(y_test, y_testprba) roc_auc_score的参数呢&#xff0c;包括两个&#…

用一杯星巴克的钱,训练自己私有化的ChatGPT

点击蓝字 关注我们 文章摘要&#xff1a;用一杯星巴克的钱&#xff0c;自己动手2小时的时间&#xff0c;就可以拥有自己训练的开源大模型&#xff0c;并可以根据不同的训练数据方向加强各种不同的技能&#xff0c;医疗、编程、炒股、恋爱&#xff0c;让你的大模型更“懂”你….…

想知道如何给游戏视频配音?有三个好方法教给你

现在越来越多的小伙伴会在闲暇之余打打游戏&#xff0c;也会观看一些游戏视频&#xff0c;其中不少游戏视频都有配音。游戏视频配音是一项有趣而富有创造力的任务&#xff0c;它可以让你为游戏画面注入声音&#xff0c;增强观众的体验。无论你是一个游戏爱好者还是一个内容创作…

前端vscode插件bito

GPT-4和ChatGPT越来越火&#xff0c;前端人员是否也能在日常工作中尝试体验其带来的乐趣呢&#xff1f; 答案是可以的&#xff01;安排&#xff01;&#xff01; 今天介绍一款vscode的插件 【bito】。 安装 安装后只需要自己注册一下&#xff0c;创建一个workspace就可以使用…

【满分】【华为OD机试真题2023B卷 JAVAJS】经典屏保

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹…

凡亿教育荣获2023 STM32峰会“生态合作伙伴”奖项

作为中国知名的电子设计在线教育领域的优秀企业&#xff0c;凡亿教育喜迎好消息&#xff01;2023年5月12日&#xff0c;STM32峰会在深圳重磅回归&#xff0c;凡亿教育荣获STM32峰会颁发的“生态合作伙伴”奖项&#xff0c;这一殊荣充分肯定了凡亿教育在STM32生态系统中的杰出贡…

C进阶:数据在内存中的存储(1)

引入&#xff1a; 大家好&#xff0c;感谢大家最近的支持&#xff0c;今天也是开始了C进阶一系列的博文的创作&#xff0c;欢迎大佬们来指点&#xff0c;欢迎来一起沟通&#xff01;&#xff01;&#xff01; 数据类型的介绍 我们都知道&#xff1a;C语言具有以下几种数据类…

拼多多继续ALL IN

2023年注定是中国电商不平凡的一年。 随着网购用户数量见顶&#xff0c;经济形势进入新常态&#xff0c;电商平台已经来到了短兵相接的肉搏战阶段。 此刻的618大促&#xff0c;硝烟弥漫&#xff0c;刀光剑影&#xff0c;电商“决战”似乎是迫在眉睫。对各个平台来说&#xff0c…

SpringBoot:WebSocket实现消息撤回、图片撤回

下面只是讲述一下实现思路&#xff0c;代码基本没有哈&#xff01;有时间单独发表一篇关于websocket的相关操作的博客。 1. 消息撤回、图片撤回 个人觉得关于撤回&#xff0c;需要下述几个过程&#xff1a; 发送的消息的标签上可以定义一个属性&#xff0c;这个属性的值应该是…

18- 弹幕系统设计

1、弹幕系统设计 场景分析&#xff1a;客户端针对某一视频创建了弹幕&#xff0c;发送后端进行处理&#xff0c;后端需要对所有正在观看该视频的用户推送该弹幕。 1.1、实现方式 使用短连接进行通信或使用长连接进行通信。 1.1.1、短连接实现方案 所有观看视频的客户端不断…

单元测试尽量不要区分类与方法

单元测试尽量不要区分类与方法 单元测试是软件开发中非常重要的一环&#xff0c;其主要作用是在开发过程中对代码进行自动化测试与检验&#xff0c;从而保证代码质量&#xff0c;减少错误和缺陷的产生。然而&#xff0c;在实际的单元测试中&#xff0c;很多人会选择将测试分成类…

svg教程-初识svg

第一章 认识svg 简单来说&#xff1a; 位图&#xff1a;放大会失真图像边缘有锯齿&#xff1b;是由像素点组成&#xff1b;前端的 Canvas 就是位图效果。 矢量图&#xff1a;放大不会失真&#xff1b;使用 XML 描述图形。 我在 知乎 上找了一个图对说明一下。 左边是位图&…

chatgpt赋能python:用Python打造个人网站的SEO优化

用Python打造个人网站的SEO优化 简介 在互联网时代&#xff0c;拥有一个个人网站已经成为了一个时尚和必要的事情。网站不仅可以展示你的技能和个人风采&#xff0c;还可以提高你的知名度和影响力。但是&#xff0c;如何让人们发现你的网站&#xff0c;通过搜索引擎来访问你的…

从中序与后序遍历序列构造二叉树(java)

从中序与后序遍历序列构造二叉树 leetcode 106 题 从中序与后序遍历序列构造二叉树解题思路解题代码&#xff1a;二叉树专题 leetcode 106 题 从中序与后序遍历序列构造二叉树 leetcode 106:从中序与后序遍历序列构造二叉树 原题链接 题目描述&#xff1a; 给定两个整数数组 i…

342. 4的幂

342. 4的幂 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 342. 4的幂 https://leetcode.cn/problems/power-of-four/ 完成情况&#xff1a; 解题思路&#xff1a; 跟之前的一个丑数一样&#xff0c;循环条件就…

使用VSCode SSH公网远程连接本地服务器开发 - cpolar内网穿透

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

MySQL-事件详解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

本地Linux服务器安装MongoDB数据库【公网远程数据库】

文章目录 &#x1f449;关于作者&#x1f449;前言&#x1f61c;1. 配置Mongodb源&#x1f61c;2. 安装MongoDB&#x1f61c;3. 局域网连接测试&#x1f61c;4. 安装cpolar内网穿透&#x1f61c;5. 配置公网访问地址&#x1f61c;6. 公网远程连接&#x1f61c;7. 固定连接公网地…

基于Kubernetes的实战案例分享

▲ 点击上方"DevOps和k8s全栈技术"关注公众号 本技术文档旨在分享一个基于Kubernetes&#xff08;简称K8s&#xff09;的实际应用案例。我们将介绍K8s集群的规模、部署架构&#xff0c;并详细说明该案例在生产环境中的实际应用。通过本文档&#xff0c;读者将能够了解…

elasticsearchelastic-head docker安装

Elasticsearch8.7.1 安装 拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.7.1创建elastic 网络 docker network create elastic执行创建 docker run --name esA --net elastic -p 9200:9200 -e ES_JAVA_OPTS"-Xms1g -Xmx1g" -it dock…