Socket通信详细介绍1

简介: Socket通信详细介绍

什么是Socket?

Socket(套接字),,用来描述IP地址和端口,是通信链的句柄,是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示。

通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

例子: 一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。


插述:

TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。

Socket是如何创建的?

Socket  是和应用程序一起创建的。应用程序中有一个 socket 组件,在应用程序启动时,会调用 socket 申请创建套接字,协议栈会根据应用程序的申请创建套接字:首先分配一个套接字所需的内存空间,这一步相当于是为控制信息准备一个容器,但只有容器并没有实际作用,所以你还需要向容器中放入控制信息;如果你不申请创建套接字所需要的内存空间,你创建的控制信息也没有地方存放,所以分配内存空间,放入控制信息缺一不可。至此套接字的创建就已经完成了。

套接字创建完成后,会返回一个套接字描述符给应用程序,这个描述符相当于是区分不同套接字的号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。

Socket通信实现步骤解析

Socket通信实现步骤解析

  1. 创建ServerSocket和Socket
  2. 打开连接到的Socket的输入/输出流
  3. 按照协议对Socket进行读/写操作
  4. 关闭输入输出流,以及Socket

Socket编写流程

Socket编写流程

  • 服务端
  1. 先创建ServerSocket对象,用来绑定监听的端口;
  2. 再调用accept()方法来监听客户端的请求;
  3. 连接建立后,通过输入流读取客户端发送的请求信息,通过输出流向客户端发送响应信息;
  4. 最后记得关闭相关资源。
  • 客户端
  1. 先创建Socket对象,要指明需要链接的服务器的地址和端号,即两个参数;
  2. 链接建立后,通过输出流向服务器发送请求信,通过输出流获取服务器响应的信息;
  3. 最后关闭相关资源
  4. 步骤: 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

代码示例

// 创建Socket客户端对象
Socket s = new Socket("127.0.0.1",6666);
// 创建ServerSocket服务器端对象
ServerSocket ss = new ServerSocket(6666);
// 监听服务器连接
s = ss.accept();

Socket中TCP的三次握手建立连接详解

我们知道tcp建立连接要进行“三次握手”,即交换三个分组。
// 大致流程如下:
  1.客户端向服务器发送一个SYN J
  2.服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
  3.客户端再想服务器发一个确认ACK K+1
    
当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;
服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;
客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;
服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

// 总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

Socket中TCP的四次握手释放连接详解

// 图示过程如下:
  1.某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
  2.另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
  3.一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
  4.接收到这个FIN的源发送端TCP对它进行确认。
这样每个方向上都有一个FIN和ACK。

Socket通信详细介绍2:https://developer.aliyun.com/article/1473578

目录
打赏
0
0
0
0
43
分享
相关文章
Flutter 之列表下拉刷新和上拉加载
在实际的 App 中,下拉刷新和上滑加载更多是非常常见的交互形式。在 Flutter 中,有 flutter_easyrefresh开源插件用于实现下拉刷新和上滑加载更多。本篇介绍了有状态组件和 flutter_easyrefresh 的基本应用,同时使用模拟的方式完成了异步数据加载。
810 0
Flutter 之列表下拉刷新和上拉加载
iOS用原生代码读写Webview的Local Storage
背景 公司项目使用的Cordova混合开发的,有一个模块以前用H5实现的,新版本用原生来实现,于是需要迁移数据。H5使用的Local Storage存的数据,原生要拿到数据有两种方案: 用WebView执行js方法来读取数据; 找到Local Storage存储路径,直接读取; 方案一实现起来比较简单,但是会存在一些问题,需要多开一个Webview来迁移数据,而且这个过程不好控制,不是最优解,本文讨论的是方案二。
3136 0
AIGC的五个特点
【1月更文挑战第11天】AIGC的五个特点
1138 3
AIGC的五个特点
通义灵码实践场景与效果分享
作为后端开发工程师,我利用通义灵码结合企业知识库和代码库,生成符合团队规范的代码,效率提升约40%。灵码支持实时智能补全、代码质量提升及文档自动生成,简化了开发流程,减少了重复工作,显著提升了团队的开发效率和代码质量。
Sprunki Game 实现技术分析及介绍
**Sprunki** 是一款基于音乐创作的游戏,作为经典游戏 **Incredibox** 的粉丝改版,它采用 HTML5 和 JavaScript 构建,通过拖拽式 UI 和模块化声音系统,提供了一个创意十足的音乐创作平台。游戏支持多种设备,并融入了 CSS3 动画和 Web Audio API,增强视觉与音效同步。玩家还可以通过社交媒体分享作品,参与社区互动。Sprunki 不仅是一款游戏,更是一个开放的创作平台。
python基础篇:图解Python字典,一目了然的键值对数据结构!
【4月更文挑战第6天】python基础篇:图解Python字典,一目了然的键值对数据结构!
287 2
python基础篇:图解Python字典,一目了然的键值对数据结构!
Python将md批量转为docx
这两天写毕业论文, 发现了一个可以将markdown快速转为word格式的小工具pandoc, 非常好用, 比如我有一个名为毕业论文.md的文件, 我只需在命令行运行 pandoc 毕业论文.
1782 0
基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(排它条件网关)
基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(排它条件网关)
226 3
基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(排它条件网关)
autojs之停止其他脚本
步骤 1. 获取本身脚本的名字 2. 获取所有脚本的名字 3. 遍历所有脚本
888 0
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
270 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问