9

基本サーバー(Beginning Pythonからコピー)を取得してstrを送信しようとしています。

エラー:

c.send( "XXX" )
TypeError: must be bytes or buffer, not str

オブジェクトをピクルスにするときに機能するようです。私が見つけたすべての例は、問題なく文字列を送信できるようです。

どんな助けもいただければ幸いです、

スティーブン

import socket  
import pickle  

s = socket.socket()

host = socket.gethostname()

port = 80

s.bind((host, port))

s.listen(5)

while True:  
    c, addr = s.accept()  
    print( "Got Connection From ", addr )  
    data = pickle.dumps(c)  
    c.send( "XXX" )  
    #c.send(data)  
    c.close()
4

2 に答える 2

22

Python3でPython2.xの例を使おうとすると、それらのPythonバージョン間の主な違いの1つにぶつかったようです。

Python <3の場合、「文字列」は実際にはバイナリ文字列であり、「ユニコードオブジェクト」は正しいテキストオブジェクトです(任意のUnicode文字を含めることができるため)。

Python 3では、Unicode文字列は「通常の文字列」(str)であり、バイト文字列は個別のオブジェクトです。

低レベルのI/Oは、テキスト(文字のシーケンス)ではなく、データ(バイト文字列)でのみ実行できます。Python 2.xの場合、strは「バイナリデータ」タイプでもありました。Python 3では、それはもはや存在せず、特別な「データ」オブジェクトの1つを使用する必要があります。オブジェクトはそのようなバイト文字列にピクルスされます。コードに手動で入力する場合は、「b」プレフィックス(「XXX」ではなくb「XXX」)を使用します。

于 2010-03-09T19:36:34.087 に答える
12

Jacek Konieczny の回答に追加するには: str.encode()を使用して、文字列からバイトを取得することもできます。リテラルではなく変数に文字列がある場合は、encode を呼び出すことができ、同等の一連のバイトが返されます。

于 2010-03-09T19:54:27.357 に答える