python - python如何区分字符串和二进制消息——TCP Socket发送

标签 python sockets tcp binary

我在来自 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/

相关文章:

sockets - 将或 "connect"QUdpSocket 绑定(bind)到远程主机和端口?

java - Ubuntu 上的最大 TCP 连接数

c - 在子进程中打开文件

python - PuLP 和 OR-Tools 替代品

python - 重用中间层作为 Keras 中另一个模型的输入

c++ - 带套接字的 POST 请求

android - 美国运营商(或与此相关的任何运营商)的空闲 TCP 超时

python - 在 Python 中使用 Pandas 重复年度循环

python - 当查询以注释开始时,python 的 sqlite3 中的隐式提交

java - 如何重用 java.net.socket 的输入流?