Socket传输int对象接收后为b' ',如何保持其int类型?
解决Socket传输int对象后接收异常的问题
首先得明确一个核心点:Socket的send()方法只接受字节类对象(bytes-like),你直接传入int类型的code=123,实际运行时会触发TypeError(不信你跑一遍原代码试试),你提到接收端得到b' ',大概率是异常导致的错误输出,或者代码执行时出了其他问题。
要实现int的正确传输,我们需要先把int转换成字节流,接收端再把字节流转回int,下面给你两种常用的解决方案:
方法一:用struct模块进行二进制打包(推荐用于数值传输)
这种方式是专业的二进制数据传输方案,能精准控制字节长度和字节序,适合传输数值类型,效率更高。
修正后的客户端代码
import socket import struct sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) code = 123 try: sock.connect(('192.168.1.10', 12345)) # 把int打包成4字节的大端字节流(!i表示网络字节序的int) packed_data = struct.pack('!i', code) sock.send(packed_data) print(sock.recv(1024).decode('ascii')) finally: sock.close()
对应的服务端接收代码
import socket import struct server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_sock.bind(('0.0.0.0', 12345)) server_sock.listen(1) conn, addr = server_sock.accept() try: # 接收4字节数据(和打包时的格式对应) data = conn.recv(4) if data: # 解包回int,注意unpack返回的是元组,取第一个元素 code = struct.unpack('!i', data)[0] print(f"收到的int值: {code}") conn.send(b"Received the integer successfully") finally: conn.close() server_sock.close()
方法二:转成字符串再编码(适合简单场景)
如果不需要高性能,这种方式更直观,代码也更简单——把int转成字符串后编码成字节传输,接收端再解码转成int。
修正后的客户端代码
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) code = 123 try: sock.connect(('192.168.1.10', 12345)) # 把int转字符串,再编码为ASCII字节 sock.send(str(code).encode('ascii')) print(sock.recv(1024).decode('ascii')) finally: sock.close()
对应的服务端接收代码
import socket server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_sock.bind(('0.0.0.0', 12345)) server_sock.listen(1) conn, addr = server_sock.accept() try: data = conn.recv(1024).decode('ascii') if data: # 把解码后的字符串转回int code = int(data) print(f"收到的int值: {code}") conn.send(b"Received the integer successfully") finally: conn.close() server_sock.close()
简单总结下:
- 用
struct的方式适合需要精确控制数据格式的场景,比如跨语言传输数值; - 字符串转换的方式更适合快速实现,代码易读性高。
内容的提问来源于stack exchange,提问作者Jodh Singh
相关产品推荐
相关产品推荐

