Python 网络编程记录:TCP socket wav 音频传输

记录在实际学习过程中遇到的一些问题,需求问题出发。

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语句。

客户端 socket 的关闭(对应服务端的阻塞)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值