什么是Socket、Socket在Java中的应用、Socket和SocketChannel区别

news2024/11/21 2:40:04

目录

什么是Socket

TCP\IP UDP体系结构

Socket和TCP\IP的关系

Socket在Java中的应用

Socket和SocketChannel的区别

SocketChannel和Selector的关系

服务器的设计演化历程---多线程版

服务器的设计演化历程---线程池版

服务器的设计演化历程---Selector版

参考链接


什么是Socket

        理解Socket之间首先需要了解TCP\IP协议:

TCP\IP UDP体系结构

        TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。下面是他们三者的关系:

        在OSI参考模型中将网络分为5层:应用层、传输层、网络层、数据链路层、物理层。

         数据在网络中的传输过程:

        看上面的图,发送端想要发送数据到接收端。首先

  • 应用层准备好要发送的数据,然后给了传输层。
  • 传输层的主要作用就是为发送端和接收端提供可靠的连接服务,传输层将数据处理完后就给了网络层。
  • 网络层的功能就是管理网络,其中一个核心的功能就是路径的选择(路由),从发送端到接收端有很多条路,网络层就负责管理下一步数据应该到哪个路由器。
  • 选择好了路径之后,数据就来到了数据链路层,这一层就是负责将数据从一个路由器送到另一个路由器。
  • 然后就是物理层了,可以简单的理解,物理层就是网线一类的最基础的设备。

         借助物流的例子理解数据传输过程:

        小明住在上海市长江路幸福小区5#666,现在小明在京东上面买了一部小米10Pro。京东在接到小米的订单后,工作人员从仓库中找到一部小米10Pro(应用层)。工作人员将手机打包好, 交给了京东物流(传输层)。接下来手机就到了转运中心(路由器),转运中心根据时间,成本等一系列因素决定下一步该发往哪一个转运中心(网络层)。决定好接下来发往哪一个转运中心后就开始用货车运输了,那么运输的过程就是数据链路层了,链路层负责将数据从一个端点送到另一个端点。那么货车行驶的道路就是物理层。几经周转,手机安全地送到了小明手上。

Socket和TCP\IP的关系

        Socket是应用层与TCP\IP协议族通信的中间软件抽象层,它是一组接口。在用户进程与TCP\IP协议之间充当中间人,完成TCP\IP协议的书写,用户只需要理解端口即可。Socket在设计模式中可以理解为一个门面模式,它把复杂的TCP\IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。

        我们将一个小区比作一台计算机,一台计算机里面跑了很多程序,怎么区分程序呢,用的是端口,就好像小区用门牌号区分每一户人家一样。手机送到小明家了,怎么进去呢?从大门进啊,怎么找到大门呢?门牌号呀。不就相当于从互联网来的数据找到接收端计算机后再根据端口判断应该给哪一个程序一样吗。小明家的入口就可以用小区地址+门牌号进行唯一表示,那么同样的道理,程序也可以用IP+端口号进行唯一标识。那么这个程序的入口就被称作Socket。

Socket在Java中的应用

        Socket编程:我们可以参考Java中对Socket的具体实现将TCP协议功能简化为三个功能:建立连接、发送数据以及接收数据。

        在Java实现的socket编程中接口实现在以下三个工具包中:

 

 

        使用Java实现客户端、服务端通信代码如下所示:

// Client
@Slf4j
public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",9000);
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            oos.writeInt(123);
            oos.flush();
            Thread.sleep(3000);
            Object object = ois.readObject();
            log.info("client receive messgae : {}", object);
        } catch (IOException |InterruptedException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

// Server
@Slf4j
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(9000);
            // serverSocket建立连接后建立的仍然是一个socket对象
            Socket socket = serverSocket.accept();
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            int serRecvVal = ois.readInt();
            log.info("serRecvVal : {}", serRecvVal);
            oos.writeObject("Hello Client.");
            oos.flush();
            while (true){

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Socket和SocketChannel的区别

        Socket、SocketChannel二者的实质都是一样的,都是为了实现客户端与服务器端的连接而存在的,但是在使用上,却有很大的区别。具体如下:

        所属包不同 
 Socket在java.net包中,而SocketChannel在java.nio包中。

        异步方式不同 
        从包的不同,我们大体可以推断出他们主要的区别:Socket是阻塞连接(当然我们可以自己实现非阻塞),SocketChannel可以设置非阻塞连接。 
        使用ServerSocket、Socket类时,服务端Socket往往要为每一个客户端Socket分配一个线程,而每一个线程都有可能处于长时间的阻塞状态中。过多的线程也会影响服务器的性能(可以使用线程池优化,具体看这里:如何编写多线程Socket程序)。

        而使用SocketChannel、ServerSocketChannel类可以非阻塞通信,这样使得服务器端只需要一个线程就能处理所有客户端socket的请求。

SocketChannel和Selector的关系

        channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层。

        常见的channel有:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannle。

        Selector可以和网络传输相关的channle结合实现IO多路复用:单线程实现多个channel的connect、read、write时间监听。能够有效避免CPU空转以及阻塞模式带来的影响。

服务器的设计演化历程---多线程版

        使用一个Thread监听一个具体的socket,当socket连接数据巨大时,需要开启多个线程来进行监听,内存占用率过高,可能导致OOM。此外多个线程之间需要频繁切换成本高。只适合与连接数比较小的场景使用。

服务器的设计演化历程---线程池版

        创建一个线程池,线程池中有若干线程,其中每个线程负责对应的若干socket。

        在阻塞模式下,线程只能处理一个socket,并等待其处理结束才能继续处理下一个socket,因此此种模式只适合与但链接的场景下使用。

服务器的设计演化历程---Selector版

        selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景(low traffic)

        调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理。

参考链接

用大白话解释什么是Socket-CSDN博客

Socket的学习(一)什么是Socket?-CSDN博客 

Socket、SocketChannel区别_socketchannel和socket的区别-CSDN博客

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

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

相关文章

深度学习loss

pytorch模型训练demo代码 在PyTorch中,模型训练通常涉及几个关键步骤:定义模型、定义损失函数、选择优化器、准备数据加载器、编写训练循环。以下是一个简单的PyTorch模型训练演示代码,该代码实现了一个用于手写数字识别(使用MNIS…

大数据——HBase原理

摘要 HBase 是一个开源的、非关系型的分布式数据库系统,主要用于存储海量的结构化和半结构化数据。它是基于谷歌的 Bigtable 论文实现的,运行在 Hadoop 分布式文件系统(HDFS)之上,并且可以与 Hadoop 生态系统的其他组…

线程与进程的区别与联系,线程状态的切换

目录 什么是线程?进程?协程? 线程和进程的区别? 多线程的好处: 单核CPU有没有必要上多线程? 为什么没有变成单进程多线程的操作系统? 线程的状态 sleep () 和wait&…

1.4 操作系统结构

操作系统的体系结构:操作系统的内核设计(本节内容简要了解即可) 宏内核 & 微内核 操作系统的内核 计算机系统的层次结构将操作系统部分更详细地划分为内核部分和非内核部分 宏内核 & 微内核 从操作系统的内核架构来划分&#xff…

【初阶数据结构篇】时间(空间)复杂度

文章目录 算法复杂度时间复杂度1. 定义2. 表示方法3. 常见时间复杂度4.案例计算分析冒泡排序二分查找斐波那契数列(递归法)斐波那契数列(迭代法) 空间复杂度案例分析冒泡排序斐波那契数列(递归法)斐波那契数…

【ACM独立出版,高录用】第四届物联网与机器学习国际学术会议(IoTML 2024,8月23-25)

2024年第四届物联网与机器学习国际学术会议(IoTML 2024)将于2024年8月23-25日在中国南昌召开。 会议将围绕着物联网和机器学习开展,探讨本领域发展所面临的关键性挑战问题和研究方向,以期推动该领域理论、技术在高校和企业的发展和…

yolov8标注细胞、识别边缘、计算面积、灰度值计算

一、数据标注 1. 使用labelme软件标注每个细胞的边界信息,标注结果为JSON格式 2. JSON格式转yolo支持的txt格式 import json import os import glob import os.path as osp此函数用来将labelme软件标注好的数据集转换为yolov5_7.0sege中使用的数据集:param jsonfi…

数据库技术深度解析与未来趋势展望

数据库技术深度解析与未来趋势展望 引言 在当今信息化高速发展的时代,数据库作为数据存储和管理的核心基础设施,扮演着至关重要的角色。无论是传统行业还是新兴的互联网领域,数据库的稳定性和性能直接影响到业务系统的运行效率和用户体验。本…

计算机基础-IO

一、裸机中的IO 我们先看下计算机的组成部分: 从图中我们很清楚的看到Input/Output 即为 IO,也就是计算机主机和外部设备进行信息的交换。 这种交换可能是磁盘IO也有可能是网络IO。 二、操作系统中的IO 操作系统分为内核态和用户态,且默认…

GPT-4o mini 震撼登场:开发者的新机遇与挑战

GPT-4o mini 震撼登场:开发者的新机遇与挑战 一、引言二、GPT-4o mini 模型的卓越性能三、极具竞争力的价格优势四、开发者的探索与实践五、提升开发效率和创新能力的策略六、面临的挑战与应对措施七、未来展望八、总结 在科技的浪潮中,OpenAI 最新推出的…

基于springboot+vue+uniapp的网上花店小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

概率论--置信区间和置信度

目录 置信区间 置信度 关系与权衡 置信区间的计算公式有哪些不同的变体,以及它们各自的适用情况是什么? 基于正态分布的置信区间: 基于t分布的置信区间: 单边置信区间: 如何根据不同的研究目的和数据类型选择合…

【React】详解自定义 Hook

文章目录 一、自定义 Hook 的基本用法1. 什么是自定义 Hook?2. 创建自定义 Hook3. 使用自定义 Hook 二、自定义 Hook 的进阶应用1. 处理副作用2. 组合多个 Hook3. 参数化 Hook4. 条件逻辑 三、自定义 Hook 的实际应用案例1. 实现用户身份验证2. 实现媒体查询 四、最…

【NPU 系列专栏 2.5 -- GPU 与 NPU 的区别】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 GPU 简介GPU 缺点NPU 特点NPU 应用场景NPU 与 GPU 的关系和区别NPU 与 GPU 区别GPU 简介 GPU 最初设计用于图形渲染和图像处理。近年来,由于其强大的并行计算能力,GPU 被广泛应用于通用计算领域,特别是深度学习和科学计算。…

堆的实现-适用于算法竞赛

首先讲一下能够实现的操作。 插入一个数查找最小值删除最小值删除任意一个元素修改任意一个元素 什么是堆? 堆其实是一棵完全二叉树。 即处理叶子节点和倒数第一层节点,其他节点都有两个子节点,而且顺序是从上到下,从左到右。 …

C# 简单的单元测试

文章目录 前言参考文档新建控制台项目新建测试项目添加引用添加测试方法测试结果(有错误)测试结果,通过正规的方法抛出异常 总结 前言 听说复杂的项目最好都要单元测试一下。我这里也试试单元测试这个功能。到时候调试起来也方便。 参考文档 C# 单元测试&#xf…

JavaFX布局-TilePane

JavaFX布局-TilePane 常用属性alignmenttileAlignmentorientationhgapvgappadding 实现方式Javafxml 自动排列其子节点成网格状根据容器的大小以及子节点的数量和大小自动计算最佳的排列方式推荐子节点固定大小,参差不齐的子节点,效果很诡异 常用属性 …

【VS2019安装+QT配置】

【VS2019安装QT配置】 1. 前言2. 下载visual studio20193. visual studio2019安装4. 环境配置4.1 系统环境变量配置4.2 qt插件开发 5. Visual Studio导入QT项目6. 总结 1. 前言 前期安装了qt,发现creator编辑器并不好用,一点都不时髦。在李大师的指导下&…

基于Springboot的高校毕业生资格审查系统/计算机项目/Java、Web/课设

摘 要 计算机网络与信息化管理相配合,可以有效地提高管理人员的工作效能和改进工作的质量。良好的高校毕业生资格审查系统可以使管理员工作得到更好的管理和应用,并有助于管理员更好地管理高校毕业生资格审查,并有助于解决人力管理中出现的差…

C++第二十八弹---进一步理解模板:特化和分离编译

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3. …