文章目录
记录在实际学习过程中遇到的一些问题,从需求和问题出发。
Socket API 概览
主要的Socket API 函数和方法:
- socket()
- bind()
- listen()
- accept()
- connect()
- connect_ex()
- send()
- recv()
- close()
服务端
常见问题
分包和粘包问题
- 参考
核心:客户端要告知服务端什么时候传输完毕,避免让服务端持续地等待接收而跳不出包含了recv()函数的while循环。
一条可行的解决办法:将数据长度写进包头
阻塞问题
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
核心:使用一个判断语句来跳出while循环对recv()
的阻塞调用
:
如果 conn.recv() 方法返回一个空 byte 对象(b'')
,然后客户端关闭连接,循环结束,with 语句和 conn 一起使用时,通信结束的时候会自动关闭 socket 链接
注意:每次传输完毕之后,客户端需要断开socket!
丢包问题
自定义协议头
处理多个连接
wav音频的传输和保存
- 点击
核心:使用wave.writeframes()
写入音频数据流
其他
持续开启服务端
将接受TCP连接 accept()函数置于 while循环之内,可以持续的连接和传输,而不是传一次就断开server。
with 语句的使用
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s
socket.socket() 创建了一个 socket 对象,并且支持 context manager type,你可以使用 with 语句,这样做的好处就是不用再手动调用 s.close() 来关闭 socket 了
同理,在用while调用 recv()函数时,也可以使用with语句。