软件架构
1.CS架构
- CS(Client Server):客户端,服务器架构
2. BS架构
- BS(Broswer Server): 浏览器, 服务器架构
基于socket模块的网络通信实现
1. 一次请求一次响应的简单示例
- server
import socket
server = socket.socket()
server.bind(("127.0.0.1", 8000))
# 最多等待5个
server.listen(5)
# 等待客户端连接
conn, addr = server.accept() # 在此阻塞, 等待连接
print(conn, addr)
# 服务端通过伞获取数据时一次最多拿1024字节
data = conn.recv(1024) # 阻塞等待消息
print(data)
# 服务端给客户端回复消息
conn.send(b"stop")
# 与客户端断开连接
conn.close()
# 服务端关闭服务
server.close()
- cilent
import socket
# 创建客户端
client = socket.socket()
# 连接服务端
client.connect(("127.0.0.1", 8000)) # 阻塞,直到连接成功为止
# 连接上服务端之后, 向服务端发送消息
msg = "hello"
client.send(msg.encode("utf-8"))
# 接收来自服务端发送的消息
data = client.recv(1024) # 阻塞, 等待消息
print(data)
# 关闭
client.close()
2. 一次连接,多次收发的简单示例
- server
import socket # 导入socket模块
server = socket.socket() # 创建socket对象
server.bind(("127.0.0.1", 8001)) # 服务端绑定(ip, port)
server.listen(1024) # 服务端开启监听,设置最多1024个客户端连接等待
while True:
conn, addr = server.accept() # 服务器等待客户端连接
while True:
data = conn.recv(1024) # 服务器从客户端接收数据
if data == b'exit':
break
response = data + b"SB"
conn.send(response) # 服务端返回数据给科幻短
conn.close()
- client
import socket
client = socket.socket()
client.connect(("127.0.0.1", 8001)) # 连接服务端
while True:
name = input("请输入姓名:")
client.send(name.encode("utf-8"))
if name == "exit":
break
response = client.recv(1024)
print(response.decode("utf-8"))
client.close()
socket网络通信会发生阻塞的地方
-
服务端
accept() 阻塞,等待连接
recv() 阻塞,等待接收来自客户端的数据 -
客户端
connect() 阻塞等待连接服务端成功
recv() 阻塞等待接收服务端数据