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

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

Socket API 概览

主要的Socket API 函数和方法:

  • socket()
  • bind()
  • listen()
  • accept()
  • connect()
  • connect_ex()
  • send()
  • recv()
  • close()

服务端

常见问题

分包和粘包问题

  • 参考
    核心:客户端要告知服务端什么时候传输完毕,避免让服务端持续地等待接收而跳不出包含了recv()函数的while循环。
    一条可行的解决办法:将数据长度写进包头

阻塞问题

conn, addr = s.accept(
### 使用 Socket 编程实现音频文件转发 #### 客户端发送音频文件到服务器 客户端负责读取本地的音频文件并将其通过网络传输给服务器。为了确保数据能够被正确接收,在发送之前可以先告知服务器即将发送的数据大小。 ```python import socket def send_audio_file(file_path, host='127.0.0.1', port=65432): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) # 打开要传送的音频文件 with open(file_path, 'rb') as f: file_data = f.read() # 发送文件长度作为前缀 file_size = str(len(file_data)).encode('utf-8') size_header = b'%d\n' % len(file_size) s.sendall(size_header + file_size) # 发送实际文件内容 s.sendall(file_data) ``` 此部分代码展示了如何创建一个TCP连接并将指定路径下的音频文件发送出去[^1]。 #### 服务端接收来自客户端的音频文件 当接收到新的连接请求时,服务器会启动一个新的线程来处理该连接,并等待直到完全接收到整个文件的内容为止。之后可以选择保存这些数据至磁盘或其他存储介质中。 ```python import threading import socket def receive_and_save(conn, addr): try: header_info = conn.recv(10).strip().decode('ascii') expected_bytes = int(header_info.split('\n')[0]) received_bytes = 0 output_filename = './received_' + str(addr[1]) + '.wav' with open(output_filename, 'wb') as out_f: while received_bytes < expected_bytes: chunk = conn.recv(min(expected_bytes - received_bytes, 2048)) if not chunk: break out_f.write(chunk) received_bytes += len(chunk) print(f'Successfully saved {output_filename}') finally: conn.close() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket: server_socket.bind(('0.0.0.0', 65432)) server_socket.listen(5) print("Listening on port", 65432) while True: connection, address = server_socket.accept() thread = threading.Thread(target=receive_and_save, args=(connection,address,)) thread.start() ``` 上述程序片段说明了一个简单的多线程Socket服务器逻辑,它可以从多个客户那里接受音频流并分别存入不同的文件里[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值