programing

TypeError: 'str'이 아닌 바이트와 같은 개체가 필요합니다.

showcode 2023. 5. 5. 10:00
반응형

TypeError: 'str'이 아닌 바이트와 같은 개체가 필요합니다.

소켓을 사용하여 사용자가 제공한 입력을 수정하려는 코드는 다음과 같습니다.

from socket import *

serverName = '127.0.0.1'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input('Input lowercase sentence:')
clientSocket.sendto(message,(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print (modifiedMessage)
clientSocket.close()

이를 실행하고 입력을 제공하면 다음 오류가 발생합니다.

Input lowercase sentence:fdsgfdf
Traceback (most recent call last):
  File "C:\srinath files\NETWORKS\UDPclient.py", line 6, in <module>
    clientSocket.sendto(message,(serverName, serverPort))
TypeError: a bytes-like object is required, not 'str'

이 문제를 해결하려면 어떻게 해야 합니까?

이 코드는 Python 2에 적합합니다.그러나 Python 3에서는 비트 인코딩 오류가 발생합니다.간단한 TCP 서버를 만들려다가 같은 문제가 발생했습니다.인코딩은 이 문제를 해결합니다.이것을 사용해 보세요.sendto지휘권

clientSocket.sendto(message.encode(),(serverName, serverPort))

마찬가지로 사용해야 합니다..decode()전송된 데이터를 그대로 인쇄하려는 경우 UDP 서버 측에서 데이터를 수신합니다.

인코딩 및 디코딩은 Python 3에서 이 문제를 해결할 수 있습니다.

클라이언트 측:

>>> host='127.0.0.1'
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.connect((host,port))
>>> st='connection done'
>>> byt=st.encode()
>>> s.send(byt)
15
>>>

서버 측:

>>> host=''
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.bind((host,port))
>>> s.listen(1)
>>> conn ,addr=s.accept()
>>> data=conn.recv(2000)
>>> data.decode()
'connection done'
>>>

약간의 인코딩으로 이 문제를 해결할 수 있습니다.

클라이언트 측:

message = input("->")
clientSocket.sendto(message.encode('utf-8'), (address, port))

서버 측:

data = s.recv(1024)
modifiedMessage, serverAddress = clientSocket.recvfrom(message.decode('utf-8'))

전달된 메시지 매개 변수만 바꾸기clientSocket.sendto(message,(serverName, serverPort))로.clientSocket.sendto(message.encode(),(serverName, serverPort))그러면 당신은 python3에서 성공적으로 실행될 것입니다.

메시지에서 오류가 발생할 때마다 를 사용합니다.

(어디서my_string함수/기호에 전달하는 문자열입니다.

encode의 방법str objects는 문자열의 인코딩된 버전을 개체로 반환합니다.이 특정 인스턴스에서 바이트 개체를 문자열 개체가 아니라 보낼 데이터로 예상하는 것과 같은 소켓 메서드입니다.

유형의 개체를 가지고 있기 때문에str그리고 당신은 그것을 유형의 객체를 기대하는 기능/기능에 전달합니다.bytes다음을 명확하게 설명하는 오류가 발생합니다.

TypeError: a bytes-like object is required, not 'str'

그래서 그encode문자열의 방법이 필요합니다, 에 적용됩니다.str값을 매기고 반환합니다.bytes값:

>>> s = "Hello world"
>>> print(type(s))
<class 'str'>
>>> byte_s = s.encode()
>>> print(type(byte_s))
<class 'bytes'>
>>> print(byte_s)
b"Hello world"

여기 접두사bb'Hello world'이것이 실제로 바이트 개체임을 나타냅니다.그런 다음 원하는 기능으로 전달하여 원활하게 실행할 수 있습니다.

보내는 데이터에 다음과 같이 "b"를 추가합니다. request = client.send(b"GET / HTTP/1.1\r\nHost: google.com \r\n").

언급URL : https://stackoverflow.com/questions/33003498/typeerror-a-bytes-like-object-is-required-not-str

반응형