私はPythonとネットワーキングを探し回っています。
while True:
data = sock.recv(10240)
これは間違いなく聞いています。ただし、テキスト文字列に変換する必要があるようです。
struct.unpack()を使用している人を見たことがありますが、それがどのように機能するのか正確にはわかりません。変換する方法は何ですか?
私はPythonとネットワーキングを探し回っています。
while True:
data = sock.recv(10240)
これは間違いなく聞いています。ただし、テキスト文字列に変換する必要があるようです。
struct.unpack()を使用している人を見たことがありますが、それがどのように機能するのか正確にはわかりません。変換する方法は何ですか?
返されるrecv
のはbytes
文字列です。
ソケットからデータを受信します。戻り値は、受信したデータを表すバイトオブジェクトです。
Python 3.xでは、bytes
文字列をUnicodeテキスト文字列に変換するstr
には、文字列がエンコードされている文字セットを知っている必要があるため、を呼び出すことができますdecode
。たとえば、UTF-8の場合:
stringdata = data.decode('utf-8')
(Python 2.xでは、bytes
と同じstr
であるため、すでに文字列があります。ただし、Unicodeテキスト文字列を取得する場合は、unicode
3.xと同じです。)
人々がよく使用する理由struct
は、データが8ビットまたはUnicodeテキストだけでなく、他の形式であるためです。たとえば、各メッセージを「ネット文字列」として送信できます。長さ(ASCII数字の文字列)、:
区切り文字、length
UTF-8のバイト、 .,
などのaの順になりb"3:Abc,"
ます。(フォーマットにはバリエーションがありますが、これはBernsteinの標準ネットストリングです。)
人々がネットストリングまたは他の同様の技術を使用する理由は、TCPを使用しているときにメッセージを区切るための何らかの方法が必要だからです。それぞれrecv
が、反対側が通過したものの半分を与えるかsend
、3send
秒と4番目の一部を与える可能性があります。したがって、データのバッファを蓄積してから、recv
そこからメッセージを引き出す必要があります。そして、あるメッセージがいつ終了し、次のメッセージがいつ始まるかを知るための何らかの方法が必要です。改行なしでプレーンテキストメッセージを送信するだけの場合は、改行を区切り文字として使用できます。それ以外の場合は、他の何かを考え出す必要があります。たとえば、ネットストリング、\0
区切り文字としての使用、改行を区切り文字として使用するがデータ内の実際の改行のエスケープ、JSONなどの自己区切りの構造化形式の使用などです。
Python 2.7.x以前では、data
はすでに文字列です。Python 3.xでは、data
はバイトオブジェクトです。バイトを文字列に変換するには、decode()
メソッドを使用します。 decode()
'utf-8'のようなコーデック引数が必要になります。