这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
前言
Socket编程在现代编程中占据了十分重要的地位,比如我们每天都在使用的实时聊天应用、使用浏览器获取取我们想要的信息等,它们的背后都离不开Socket。那么,Socket是什么呢?
介绍
Socket其实就是套接字。它起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现。
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
为什么要有Socket
Socket其实是应用层与传输层中间的一个平台,它封装了底层的很多操作,为上层提供一些接口,使得上层能够使用这些接口很方便地完成原先繁重复杂的操作。
我们可以将这个设计类比为设计模式中的外观模式(Facade),在原先的实际中,用户如果需要完成某项操作可能就要深入底层逻辑,这个过程可能会很复杂,因为这个操作可能要牵扯到多个模块,对于用户来说是一个不小的负担。这时我们可以将这些模块进行封装,对外提供一个接口,用户需要时直接调用即可,使得用户能从底层当中解放出来。
网络通信也是如此,而Socket的出现很好地解决了网络通信这一领域的问题。
如何通信
网络中的通信其实是进程与进程间的通信,IP地址可以帮助我们找到指定的主机,而协议+端口则可以帮助我们找到主机上的进程。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中需要互相通信的进程,就可以利用这个标志在他们之间进行交互。
重要接口
Server
- socket():表示创建一个 socket,底层会生成一个文件描述符,用来表示该 socket
- bind():用来绑定服务的端口,地址,这里一般都是以固定的为主,因为在客户端连接的时候需要指定
- listen():当绑定完成之后,listen 就会监听这个端口的数据包
- accept():相当于一个开关,表示我准备好了,可以接受请求了,但是这里会一直阻塞,直到客户端连接成功
- read():读取客户端发送过来的内容
- write():客户端写入要返回的数据
- close():断开连接,「四次挥手」
Client
- socket():表示创建一个 socket,底层会生成一个文件描述符,用来表示该 socket
- connet():表示与指定地址进行连接,在此之前,会随机创建自己的端口,tcp 的**「三次握手就是从这里开始」**的
- write():客户端写入要发送的数据
- read():客户端读取服务端返回的数据
- close():断开连接,「四次挥手」,给客户端发送断开连接的信息
若有错误或疏漏,还望海涵。
文章部分内容参考:这次要把 socket 玩的明明白白