1. 程式人生 > >Socket send() method throws TypeError: a bytes-like object is required, not 'str'

Socket send() method throws TypeError: a bytes-like object is required, not 'str'

error: ring net peer 函數 搜索 string類型 unicode 區分

python3 socket編程,發送data數據,會遇到需要bytes類型,而不是str字符串的錯誤

例如:

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("www.google.com")
mysock.connect(host, 80)
message = "GET / HTTP/1.1\r\n\r\n"
mysock.sendall(message)
data=mysock.recv(1000)
mysock.close()

解決辦法:

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("www.google.com")
mysock.connect((host, 80))
message = "GET / HTTP/1.1\r\n\r\n"
mysock.sendall(message.encode())
data=mysock.recv(1000)
mysock.close()

只需要在string類型的data發送之前encode一下即可,接收也是一樣

before sending message through socket encode it.

sc.send(message.encode())

after receiving decode it:

message.decode()

相關知識:

Python 3最重要的新特性之一是對字符串和二進制數據流做了明確的區分。文本總是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,你不能拼接字符串和字節流,也無法在字節流裏搜索字符串(反之亦然),也不能將字符串傳入參數為字節流的函數(反之亦然)。

參考鏈接:https://www.cnblogs.com/chownjy/p/6625299.html

Socket send() method throws TypeError: a bytes-like object is required, not 'str'