客户端和服务器无法交换数据python

时间:2012-10-28 11:34:12

标签: python sockets

我正在使用python 3.3。这是Server.py.Everything很好服务器和客户端都可以连接 这里'tcpcli.send('[%s]%s'%(字节(ctime(),'utf-8'),数据))'可能有问题'。'帮帮我

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

2 个答案:

答案 0 :(得分: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"))

答案 1 :(得分:1)

您正在构建unicode字符串,而不是字节字符串,并且套接字接口不支持unicode字符串。您需要对字符串插值的结果进行编码:

    tcpcli.send(bytes('[%s]%s' % (ctime(),data), 'utf-8'))