私はクライアント側で値を読み込んでいて、それがサーバー側に送信して、素数かどうかを確認できるようにしたいと考えています。サーバーが文字列を予期しているため、エラーが発生します
サーバー側
import socket
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsocket.bind( ("0.0.0.0", 8000) )
tcpsocket.listen(2)
(client, (ip,port) ) = tcpsocket.accept()
print "received connection from %s" %ip
print " and port number %d" %port
client.send("Python is fun!")
クライアント側
import sys
import socket
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
num = int(raw_input("Enter number: "))
tcpsocket.connect( ('192.168.233.132', 8000) )
tcpsocket.send(num)
Error: must be string or buffer, not int.
どうすればこれを解決できますか?
tcpsocket.send(num)
はstring
、 apiへのリンク を受け入れるため、挿入する数値をint
に変換しないでください。
受信したバイトの解釈方法を示す上位レベルのプロトコルを定義せずに、生データをストリームで送信しないでください。
もちろん、バイナリまたは文字列形式で整数を送信できます
文字列形式では、文字列の終わりマーカー、通常はスペースまたは改行を定義する必要があります
val = str(num) + sep # sep = ' ' or sep = `\n`
tcpsocket.send(val)
そしてクライアント側:
buf = ''
while sep not in buf:
buf += client.recv(8)
num = int(buf)
バイナリ形式では、正確なエンコーディングを定義する必要があります。struct
モジュールが役立ちます
val = pack('!i', num)
tcpsocket.send(val)
そしてクライアント側:
buf = ''
while len(buf) < 4:
buf += client.recv(8)
num = struct.unpack('!i', buf[:4])[0]
これらの2つの方法により、異なるアーキテクチャ間でもデータをリアルに交換できます
ソケットで整数を送信する非常に軽い方法を見つけました:
#server side:
num=123
# convert num to str, then encode to utf8 byte
tcpsocket.send(bytes(str(num), 'utf8'))
#client side
data = tcpsocket.recv(1024)
# decode to unicode string
strings = str(data, 'utf8')
#get the num
num = int(strings)
bytes()およびstr()の代わりに、encode()、decode()を使用します):
#server side:
num=123
# convert num to str, then encode to utf8 byte
tcpsocket.send(str(num).encode('utf8'))
#client side
data = tcpsocket.recv(1024)
# decode to unicode string
strings = data.decode('utf8')
#get the num
num = int(strings)