【问题标题】:Python bytes seem different than it should be in socket programmingPython 字节似乎与套接字编程中的不同
【发布时间】:2021-04-18 06:42:15
【问题描述】:

我一直在尝试学习套接字编程,我的目标是从客户端向服务器发送请求,尽管有客户端的请求,也从服务器向客户端发回响应。 在代码中,我试图发送 \x02\x03\x35\x36\x37\x01\x00\05\x02\x75 和 \x02\x05\x01\x35\x36\x01\x01\05\x02\x76数据,但在我的输出中我看到 \x02\x03567\x01\x00\x05\x02u 和 \x02\x05\x0156\x01\x01\x05\x02v 而不是它们。难道我做错了什么? 这是我的代码:

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1236))

s.listen(5)
print("Waiting for connection...")

server_message = b"\x02\x05\x01\x35\x36\x01\x01\05\x02\x76"

while True:
    clientsocket, addr = s.accept()
    print(f"Successfully connected with client from {addr}", addr)

    client_message = clientsocket.recv(1024)            # Get request from the client.
    print("Request from the Client:", client_message)

    if client_message.__eq__(b"\x02\x03\x35\x36\x37\x01\x00\05\x02\x75"): # If request is appropriate for response then;
        clientsocket.send(server_message)           # Send response to the client.
        print("Response to the Client:", server_message)

    clientsocket.close()

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1236))

client_message = b"\x02\x03\x35\x36\x37\x01\x00\05\x02\x75"

try:
    s.send(client_message)      # Send request to the server.

    server_message = s.recv(1024)       # Get response from the server.

    print("Request to the Server:", client_message)
    print("Response from the Server:", server_message)

    s.close()

except socket.error as error_message:
    print("Server is not working", error_message)

【问题讨论】:

标签: python sockets


【解决方案1】:

你没有做错任何事,他们只是看起来不同。你会很快看到你是否这样做:

>>> version1 = b"\x02\x03\x35\x36\x37\x01\x00\05\x02\x75"
>>> version2 = b'\x02\x03567\x01\x00\x05\x02u'
>>> version1==version2
True

原因是因为\x35是字符5的字节值,当Python显示字节串时,它会将任何可打印的字符渲染为该字符,如果它不可打印但有字符串转义,那么它将其呈现为字符串转义,因此作为回车符的\x0d 将显示为\r,并且它仅将一个字节呈现为十六进制转义作为最后的手段。这有多种原因,但最明显的原因之一是字节串通常包含字符数据,而b'Hello world'b'\x48\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64' 更友好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2011-09-25
    • 2011-07-17
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多