2

私はpython 3.3を使用しています。これはServer.pyです。すべて問題ありません。サーバーとクライアントの両方が接続できます。ここで何かが間違っている可能性があります 'tcpcli.send('[%s]%s'%(bytes(ctime()) ,'utf-8'),data))'.助けて

from socket import *
from time import ctime

HOST=''
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)

tcp=socket(AF_INET,SOCK_STREAM)
tcp.bind(ADDR)
tcp.listen(5)

while True:
    print('waiting for connection')
    tcpcli,addr=tcp.accept()
    print('...connected from:',addr)

    while True:
        data=tcpcli.recv(BUFSIZ)
        if not data:
            break
        tcpcli.send('[%s]%s'%(bytes(ctime(),'utf-8'),data))
    tcpcli.close()
tcp.close()                 

これはCLient.pyです

    from socket import *


HOST='127.0.0.1'
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)

tcpcli=socket(AF_INET,SOCK_STREAM)
tcpcli.connect(ADDR)


while True:
    data=input('>')
    if not data:
        break
    tcpcli.send(data)
    data=tcpcli.recv(BUFSIZ)
    if not data:
        break
    print (data.decode('utf-8'))

tcpcli.close()                 

私が両方を実行しているとき、クライアントからデータを送信できないことを除いて、それらは正常に動作しています。このエラー メッセージが表示されます。

tcpcli.send(data)
TypeError: 'str' does not support the buffer interface
4

2 に答える 2

2

Python3 を使用しています。これは、CLI を使用すると、オブジェクト ( python2 と同等)input()が返されることを意味します。入力した文字の Unicode コードポイントの内部表現が含まれています。バイト ストリーム インターフェイス (パイプ、ソケットなど) を介してデータを送信するには、データをバイト オブジェクトに変換する必要があります。これは、UTF-8 などのエンコーディングを選択し、次のようにすることで簡単に実行できます。strunicode

data_raw = data.encode("utf-8")
tcpcli.send(data_raw)

クライアントから受け取ったデータを最初にデコードし、文字列操作を行った後に再エンコードすることにより、サーバーコードを同様に適応させる必要があります。

        data_decoded = data.decode("utf-8")
        reply = '[%s]%s' % (ctime(), data_decoded)
        tcpcli.send(reply.encode("utf-8"))
于 2012-10-28T11:39:06.603 に答える
1

バイト文字列ではなく Unicode 文字列を作成しており、ソケット インターフェイスは Unicode 文字列をサポートしていません。文字列補間の結果をエンコードする必要があります。

    tcpcli.send(bytes('[%s]%s' % (ctime(),data), 'utf-8'))
于 2012-10-28T11:39:18.267 に答える