通信步骤
C/S结构 client/server
通信步骤:
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。
在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。
客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
被动:当服务器开启,不会主动访问客户端,只是被动等待请求
阻塞:当有一个用户与服务端发起通信的时候,这个时候信道阻塞,其他用户无法访问
注:TCP发送数据时,已经建立好TCP连接,所以不需要指定地址,UDP是面向无连接的,所以每次发送要指定是发送给谁
服务端与客户端之间发送的数据必须是字符串
Socket实例
server端
# coding:utf-8
import socket
# 1.创建socket实例
# AF_INET:ipv4;AF_INET6:ipv6;AF_UNIX:unix系统间的数据传输
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.绑定身份
# 参数是一个双元素元组
# 第一个元素ip,为空代表当前设备所有ip
# 第二个元素端口,0-65535
sock.bind(("",8000))
# 3.监听
# listen(5):代表队列长度为5
sock.listen(5)
# 4.接收请求端地址信息
# content:代表负责通信的套接字
# address:代表请求者身份,身份由请求者ip+端口组成
content,address = sock.accept()
# 5.接收请求端数据
# 512表示单次接收的长度,单位是字节
recv = content.recv(512)
print(recv.decode())
# 6.发送数据到请求端
sendData = input(">>>")
content.send(sendData.encode())
# 7.关闭连接,释放端口
content.close()
client端
# coding:utf-8
import socket
# 1.创建socket实例
# AF_INET:ipv4;AF_INET6:ipv6;AF_UNIX:unix系统间的数据传输
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.连接服务端
# 客户端的端口是随机分配的,这里连接的服务端为服务端的ip和端口
sock.connect(("127.0.0.1",8000))
# 3.发送数据给服务端
sendData = input(">>>")
sock.send(sendData.encode())
# 4.接收服务端数据
recv = sock.recv(512)
print(recv.decode())
# 5.关闭连接
sock.close()
运行
1)先运行server端等待连接,再运行client端连接server端
2)客户端连接后发送信息给服务端,服务端接收到客户端信息
3)服务端发送信息给客户端后,服务端连接结束
4)客户端接收到服务端信息后,客户端连接结束,一次交互结束