web-dev-qa-db-ja.com

ソケットモジュール、整数の送り方

私はクライアント側で値を読み込んでいて、それがサーバー側に送信して、素数かどうかを確認できるようにしたいと考えています。サーバーが文字列を予期しているため、エラーが発生します

サーバー側

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.

どうすればこれを解決できますか?

6
johndoe12345

tcpsocket.send(num)stringapiへのリンク を受け入れるため、挿入する数値をintに変換しないでください。

2
k4ppa

受信したバイトの解釈方法を示す上位レベルのプロトコルを定義せずに、生データをストリームで送信しないでください。

もちろん、バイナリまたは文字列形式で整数を送信できます

  • 文字列形式では、文字列の終わりマーカー、通常はスペースまたは改行を定義する必要があります

    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つの方法により、異なるアーキテクチャ間でもデータをリアルに交換できます

10
Serge Ballesta

ソケットで整数を送信する非常に軽い方法を見つけました:

#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)
2
Henning Lee