我在来自 user3132092 的 stackoverflow ( link ) 中找到了这个示例,用于 TCP 客户端通过 TCP 发送“Hello world”字符串:
发送字符串
import socket
host = socket.gethostname()
port = 12345 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.sendall(b'Hello, world')
问题是 s.sendall() 如何像接受二进制一样接受字符串作为参数? “Hello world”是否转换为二进制?
在此示例(链接)中,s.sendall( link ) 正在发送之前使用 python 结构将其转换为二进制的二进制文件。为什么“Hello World”不需要该结构?
发送二进制文件
import struct
values = (1, 'ab', 2.7)
packer = struct.Struct('I 2s f')
packed_data = packer.pack(*values)
print >>sys.stderr, 'sending "%s"' % binascii.hexlify(packed_data), values
sock.sendall(packed_data)
最佳答案
您使用的是 Python 2,b'...'
语法实际上不会生成单独的对象类型:
>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0)
>>> b'This is just a string'
'This is just a string'
>>> 'This is also just a string'
'This is also just a string'
>>> type(b'Just a string')
<type 'str'>
>>> type('Just a string')
<type 'str'>
b'...'
语法仅存在于 Python 2 中,以便更轻松地构建无需更改即可在 Python 2 和 3 上运行的代码。
struct
模块还生成str
字符串对象:
>>> import struct
>>> values = (1, 'ab', 2.7)
>>> packer = struct.Struct('I 2s f')
>>> packed_data = packer.pack(*values)
>>> packed_data
'\x01\x00\x00\x00ab\x00\x00\xcd\xcc,@'
>>> type(packed_data)
<type 'str'>
因此,您总是发送一个 str
字符串对象,这里没有魔法。在 Python 2 中,str
对象实际上只是一系列字节。
关于python - python如何区分字符串和二进制消息——TCP Socket发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519725/