Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过tcp python发送字节_Python_Tcp_Byte - Fatal编程技术网

通过tcp python发送字节

通过tcp python发送字节,python,tcp,byte,Python,Tcp,Byte,我将通过python通过tcp通道发送一个字节字符串, 位字符串有3个字节“0000100000001001”,如果我把它看作3个整数,它就是“909” 发件人代码: import socket import struct TCP_IP = '127.0.0.1' TCP_PORT = 5005 BUFFER_SIZE = 1024 MESSAGE = b"000010010000000000001001" s = socket.socket(socket.AF_INET, soc

我将通过python通过tcp通道发送一个字节字符串, 位字符串有3个字节“0000100000001001”,如果我把它看作3个整数,它就是“909”

发件人代码:

import socket
import struct
TCP_IP = '127.0.0.1' 
TCP_PORT = 5005      
BUFFER_SIZE = 1024
MESSAGE = b"000010010000000000001001"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()
print( "received data:", data)
接收器代码:

import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
print('Connection address:', addr)
while 1:
    data = conn.recv(BUFFER_SIZE)
    if not data: break
    print( "received data:", data)
    conn.send(data)  
conn.close()
我运行程序并用Wireshark捕获数据,数据包完全不同,以十六进制表示:

30 30 30 30 31 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 31
因此,我不是发送字节,而是发送字符串<代码>十六进制(ord('1'))==0x31和
hex(ord('0'))==0x30


如何才能真正发送字节?

问题不在于TCP部分,而在于字节部分。根据定义,
b“0000100000000000001001”
是一个字节字符串(
字节
在Python 3中键入),包含24个字节(不是位)-注意:一个字节有8位

因此,您需要:

...
MESSAGE = b'\x09\x00\x09'
...
或者至少

MESSAGE = b"000010010000000000001001"
MESSAGE = bytes((int(MESSAGE[i:i+8], 2) for i in range(0, len(MESSAGE), 8)))

Hrm,你确定wireshark不只是在截取点使用十六进制格式来显示包内容吗?您当然会传入字节,并且一定会再次将它们取出。最后,有很多巫术和黑魔法发生在你的playload上。您无法仅从应用程序层控制数据在线路上的外观。您正获得您要发送的内容,因为b“00001001”是一个长度为8字节的字节字符串,由“0”和“1”字符组成。