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()                 

这是客户端.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 时,input()将返回一个str对象(相当于 python2 unicode)。它包含您输入的字符的 unicode 代码点的内部表示。要通过字节流接口(例如管道、套接字等)发送数据,您必须将其转换为字节对象。这很容易通过选择编码(例如 UTF-8)并执行以下操作来完成:

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 回答