开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
Socket 基础
socket是一套用于不同主机间通信的API,工作在TCP/IP协议之上,应用无处不在。比如浏览器,手机应用,用于服务器管理的SSH客户端,全都是基于 socket 实现的,要通过 socket 与不同主机之间建立通信,我们只需要指定主机的 IP 地址和一个端口号,IP 地址用于唯一标识你的网络设备,端口用于区分主机上的不同应用。
通过 socket 我们可以建立一条用于不同主机不同应用的之间的虚拟数据通道,并且是点对点的(应用对应用的),就像是将一条数据线连接在不同应用的插槽上。
我们经常用到的 socket 有两种类型,TCP 和 UDP。
TCP主要有两个特点:就是可靠和顺序性。首先,它的底层会自动检测并回传丢失的数据包,因此对调用者来说,发送的数据,接收方一定会接收到。其次,发送和接收的顺序是完全一致的,比如发送方发送一串字符,那么接收方会原封不动的收到同样的字符,这也是 TCP 是基于数据流的协议。
UDP 以报文为单位来收发数据,并且 UDP 不会自动回传丢失的数据包,因此不保证数据一定能被接收方接收到。因为缺少了这些检查,UDP通常具有更低的延迟并占用更少的系统资源,它更适用于像是视频通话,这种 实时性要求较高的应用。
python 使用 socket 实例
首先创建一个简单的服务器,这个服务器的作用就是将接收到的消息原封不动的发送出去。
server 端代码
import socket
import threading
# with 表示代码离开 with 块的时候,自动调用 s.close() 来销毁这个 socket
# AF_INET 代表使用的是 IPV4 的地址家族,SOCK_STREAM 代表使用 TCP 协议
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# bind 表示关联到主机的某一个网卡和端口上
s.bind(("0.0.0.0", 1234))
# listen 置为监听状态,等待客户端连接
s.listen()
c, addr = s.accept()
with c:
print(addr, "connected.")
while True:
data = c.recv(1024
if not data:
break
c.sendall(data)
测试 sever 端结果
client 端代码
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("127.0.0.1", 1234))
s.sendall(b"Hello, World!")
data = s.recv(1024)
print("Received:", repr(data))