2017-06-03 9 views
0

私はPythonを使用しているRaspberryPiのUCI Coursera courseにいます。ソケットsendall()メソッドは型エラーをスローします: '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() 

私は.connect()は一個の引数、タプルをとり、それがmysock.connect((host, 80))の代わりmysock.connect(host, 80)でなければならないことであるつのエラーを修正することができました。

しかし、message値のタイプエラーがあるようです。私はmysock.sendall(message)を実行すると、それはスロー:

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

を私は講師のコードが正しいものに近かったが、いくつかの小さなことのタイプミス、または何かを持っていることを想像しなければなりません。だから私は彼らが何を書こうとしていたのか、なぜこれが違うのか把握しようとしているので、このタイプのエラーが文字列として投げられます。

私はコース内で直接フォローアップしますが、残念ながらこのフォーラムにはディスカッションフォーラムがありませんので、ここで助けていただければ幸いです。

+0

'mysock.sendallを行っている(message.encode())'または多分 'mysock.sendall(B(メッセージ)) '? – Cyclonecode

+0

message.encode()を受け取った後、それをどのようにエンコードするかmessage.decode()を受け取った後にデコードします。 –

+0

ありがとうございます。うまくいくようです –

答えて

1
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() 

エンコードを追加するだけです。

+1

ありがとう、はい私はそれをテストし、それが動作します!また、@Cycloencodeにコメントでこれを言及することを信用してください。十分な時間が経過したら、この答えを解決策としてマークします。 –

0

socket documentationを見ると、sendallにバイトを送信する必要があることがわかります。 Pythonには、文字列をバイトに変換する組み込み関数encodeがあります。したがって、それを送信できるようにバイトに変換するには

mysock.sendall(message.encode()) 

を使用する必要があります。

0

ソケットでメッセージを送信する前にエンコードします。

sc.send(message.encode()) 

それをデコードを受け取った後:

message.decode() 

すべて

関連する問題