socket网络编程

软件架构

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网络通信会发生阻塞的地方

  1. 服务端
    accept() 阻塞,等待连接
    recv() 阻塞,等待接收来自客户端的数据

  2. 客户端
    connect() 阻塞等待连接服务端成功
    recv() 阻塞等待接收服务端数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值