1、什么是socket?
由图可见, socket是连接应用层和运输层的中间层,它就是一组接口,它是应用程序访问下层网络服务的接口。
网络通信需要遵循一堆协议(如图中的TCP/UDP等),协议即标准,如果想开发一款基于网络通信的软件,就必须遵循这些标准。但是,深入理解TCP/UDP等协议并运用太过复杂,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出来的程序自然就是遵循TCP/UDP标准的。
2、socket种类
socket有两种,分别是基于文件型和基于网络型。
- 基于文件型:AF_UNIX
- 基于网络型:AF_INET
3、socket工作流程
使用socket是为了通信,所以把socket工作流程想象成现实中生活情境就容易理解了。
比如:
我要给一位朋友打电话,我先拨号——> 朋友听到电话铃声——>朋友接通电话——>我们建立起连接便可以通话了——>聊天结束——>我们挂掉电话。
socket的工作流程也是如此。
服务端先初始化socket——>然后和端口绑定(bind)——>对端口进行监听(listen)——>调用accept阻塞——>等待客户连接。
客户端初始化一个socket——>连接服务器(connect)——>开始和服务器通信。
客户端发送数据请求——>服务端接受、处理请求——>然后将回应数据发送给客户端——>客户端读取数据——>最后关闭连接——>一次交互结束。
代码演示:
注意要先运行服务端,先运行客户端会报错(Connection refused),因为此时没有服务端监听端口。
服务端代码:
import socket
# 模拟情景:给别人打电话的流程
# 1、买手机
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、绑定手机卡
phone.bind(("127.0.0.1",8080))
# 3、开机
phone.listen(5)
# 4、等电话链接
print("starting...")
conn,client_addr = phone.accept()
# 5、收、发消息
while True:
data = conn.recv(1024)
print("客户端的数据",data)
conn.send(data.upper())
# 6、挂电话
conn.close()
# 7、关机
phone.close()
客户端代码:
import socket
# 1、买手机
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、拨号
phone.connect(("127.0.0.1",8080))
# 3、发、收消息
while True:
msg = input(">>:").strip()
phone.send(msg.encode("utf-8"))
data=phone.recv(1024)
print(data)
# 4、关闭
phone.close()