iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >客户端Socket与服务端ServerSocket串联实现网络通信的方法
  • 436
分享到

客户端Socket与服务端ServerSocket串联实现网络通信的方法

2023-06-29 11:06:54 436人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“客户端Socket与服务端ServerSocket串联实现网络通信的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“客户端Socket与服务端ServerSocket串联实现网络通信的方法”文章能帮助大家解决疑惑

本文小编为大家详细介绍“客户端Socket与服务端ServerSocket串联实现网络通信的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“客户端Socket与服务端ServerSocket串联实现网络通信的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    1、类属性

    ServerSocket 的主要作用,是作为服务端的套接字,接受客户端套接字传递过来的信息,并把响应回传给客户端,其属性非常简单,如下:

    private boolean created = false;// 已创建private boolean bound = false;// 绑定private boolean closed = false;// 已关闭// 底层的功能都依靠 SocketImpl 来实现private SocketImpl impl;

    ServerSocket 和 Socket 一样,底层都是依靠 SocketImpl 的能力,而 SocketImpl 底层能力的实现基本上都是 native 方法实现的。

    2、初始化

    初始化大概可以分成两类:无参构造器和有参构造器。

    无参构造器做的事情比较简单,只指定了 SocketImpl 为 SocksSocketImpl 类;有参构造器有几种初始化的形式,我们一起来看一下参数最多的构造器的源码

    public ServerSocket(int port, int backlog, InetAddress bindAddr) throws ioException {    // 默认是 SocksSocketImpl 实现    setImpl();    // 端口必须大于 0,小于 65535    if (port < 0 || port > 0xFFFF)        throw new IllegalArgumentException(                   "Port value out of range: " + port);    // 最大可连接数如果小于1,那么采取默认的 50    if (backlog < 1)      backlog = 50;    try {        // 底层 navtive 方法        bind(new InetSocketAddress(bindAddr, port), backlog);    } catch(SecurityException e) {        close();        throw e;    } catch(IOException e) {        close();        throw e;    }}

    入参 port 指的是 ServerSocket 需要绑定本地那个端口。

    入参 backlog 指的是服务端接受客户端连接队列的最大长度,这里需要注意的是,这里并不是限制客户端连接的个数,我们在 jdk8 版本下做过实验,我们把服务端的 backlog 设置成 1,并且变慢服务端的处理速度,当服务端并发请求过来时,并不是第二个请求过来就拒绝连接,我们在实际工作中,最好也不要用 backlog 来限制客户端连接的个数。

    还有点需要注意的是 backlog 小于 1 时,backlog 会被设置成默认的 50。

    入参 InetAddress 表示 ip 地址。

    3、bind

    bind 方法主要作用是把 ServerSocket 绑定到本地的端口上,只有当我们使用无参构造器初始化 ServerSocket 时,才会用到这个方法,如果使用有参构造器的话,在初始化时就已经绑定到本地的端口上了。

    配合无参构造器,一般我们这么用:

    // 进行初始化ServerSocket serverSocket = new ServerSocket();// 进行绑定serverSocket.bind(new InetSocketAddress("localhost", 7007));

    4、accept

    accept 方法主要是用来 ServerSocket 接受来自客户端的套接字的,如果此时没有来自客户端的请求时,该方法就会一直阻塞,如果有通过 setSoTimeout 方法设置超时时间,那么 accept 只会在超时间内阻塞,过了超时时间就会抛出异常。

    bind 和 accept 方法底层都是 native 方法实现,我们就不看源码了。

    5、面试题

    5.1、说说你对 Socket 和 ServerSocket 的理解?

    答:两者我们都可以称为套接字,底层基于 tcp/UDP 协议,套接字对底层协议进行了封装,让我们使用时更加方便,Socket 常被使用在客户端,用于向服务端请求数据和接受响应,ServerSocket 常用于在服务端,用于接受客户端的请求并进行处理,两者其底层使用都是依靠 SocketImpl 的子类的 native 方法。

    5.2、说说对 SocketOptions 中的 SO_TIMEOUT 的理解?

    答:SocketOptions 类有很多属性设置,比如 SO_TIMEOUT 、SO_LINGER 等等,这些问题说一下自己的理解即可

    5.3、在构造 Socket 的时候,我可以选择 TCP 或 UDP 么?应该如何选择?

    答:可以的,Socket 有三个参数的构造器,第三个参数表示你想使用 TCP 还是 UDP。

    5.4、TCP 有自动检测服务端是否存活的机制么?有没有更好的办法?

    答:有的,我们可以通过 seTKEepAlive 方法来激活该功能,如果两小时内,客户端和服务端的套接字之间没有任何通信,TCP 会自动发送 keepalive 探测给服务端,预测服务端有三种情况:

    • 服务端使用预期的 ACK 回复,说明一切正常;

    • 服务端回复 RST,表示服务端处于死机或者重启状态,终止连接;

    • 没有得到服务端的响应(会尝试多次),表示套接字已经关闭了。

    但我们并不建议使用这种方式,我们可以自己起一个定时任务,定时的访问服务端的特殊接口,如果服务端返回的数据和预期一致,说明服务端是存活的。

    读到这里,这篇“客户端Socket与服务端ServerSocket串联实现网络通信的方法”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: 客户端Socket与服务端ServerSocket串联实现网络通信的方法

    本文链接: https://www.lsjlt.com/news/324460.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • c++中int和double有什么区别
      int 和 double 是 c++ 的数据类型,用于表示整数和浮点数。它们的关键区别在于:1. 范围:int 为整数,double 为浮点数且范围更大;2. 存储大小:int 占 4 ...
      99+
      2024-05-14
      c++ 隐式转换
    • C++ 多线程程序测试的挑战和策略
      多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞...
      99+
      2024-05-14
      c++ 多线程
    • c++中深拷贝和浅拷贝的应用时间
      浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
      99+
      2024-05-14
      c++
    • 探索用于 C++ 服务器架构的高级数据结构
      在 c++++ 服务器架构中,选择适当的高级数据结构至关重要。哈希表用于快速数据查找,树用于表示数据层次结构,图用于表示对象之间的关系。这些数据结构在实践中有着广泛的应用,例如缓存系统、...
      99+
      2024-05-14
      c++ 数据结构 社交网络 键值对
    • fixed在c++中的作用
      fixed 关键字在 c++ 中用于将浮点数存储为固定小数,提供更高精度,尤其适用于需要高精度的金融计算。fixed 将浮点数表示为具有固定小数位数的小数,默认情况下使用十进制表示法,小...
      99+
      2024-05-14
      c++
    • insert在c++中怎么用
      insert() 函数在 c++ 中用于在容器(如 vector、set)中插入元素,提供了一种动态调整容器大小并添加新元素的方法。它需要两个参数:要插入元素的位置 (pos) 和要插入...
      99+
      2024-05-14
      c++ 标准库
    • 如何使用 Golang 构建 RESTful API 并处理 JSON 响应?
      如何使用 golang 构建和处理 json 响应的 restful api步骤:创建 golang 项目并安装 gorilla mux。定义路由并处理 http 请求。安装 json ...
      99+
      2024-05-14
      golang git
    • c++中int和long的区别
      int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
      99+
      2024-05-14
      c++ 数据丢失
    • c++中int a(n)和int a[n]的区别
      int a(n)声明一个不可变的整型变量,而int a[n]声明一个可修改元素的整型数组,用于存储和处理数据序列或集合。 int a(n) 和 int a[n] 在 C++ 中的区别 ...
      99+
      2024-05-14
      c++
    • C++ 多线程编程中调试和故障排除的技术
      c++++ 多线程编程的调试技巧包括:使用数据竞争分析器检测读写冲突,并使用同步机制(如互斥锁)解决。使用线程调试工具检测死锁,并通过避免嵌套锁和使用死锁检测机制来解决。使用数据竞争分析...
      99+
      2024-05-14
      c++ 多线程 故障排除 同步机制
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作