Python:TypeError:str,bytes或bytearray expected,而不是int

时间:2017-05-17 07:46:15

标签: python python-3.x wing-ide

我正在尝试创建一个简单的服务器到基于客户端的聊天程序,问题是当我尝试执行c.sendto(data,client)时出现此错误,表示Client是一个int,但它是一个包含元组的元组端口号和地址。我应该将元组转换为字节,以便将消息发送给客户端?

服务器脚本

import socket

clients = []
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("127.0.0.1",7999))
s.listen()
print("Waiting for connection")
c, addr = s.accept()


while True:
    data , addr = c.recvfrom(1024)
    print(data)
    if addr not in clients:
        clients.append(addr)
        print(clients[0])
    if data:
        for client in clients:
            print(client)
            c.sendto(data,client)
s.close()

客户端脚本

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ("127.0.0.1",7999)
s.connect(addr)    
while True:
    string = input(">>")
    s.send(string.encode("utf-8"))
    data =s.recv(1024)
s.close()

Server Output

1 个答案:

答案 0 :(得分:0)

问题是你正在使用带有连接模式套接字的sendto()。我想你想要c.send(数据)。

详细说明:

send文件的Python文档说“套接字不应该连接到远程套接字,因为目标套接字是由地址指定的。” sendto的手册页也说“如果在连接模式(SOCK_STREAM,SOCK_SEQPACKET)套接字上使用sendto(),则会忽略参数dest_addr和addrlen(当它们不为NULL且0时,可能会返回错误EISCONN)。 “我有点怀疑这种情况正在发生,而Python却以一种令人困惑的方式误报错误。

套接字接口和网络通常很混乱,但基本上sendto()是为SOCK_DGRAM保留的,这是UDP / IP类型的互联网流量,您可以将其视为向收件人发送信件或明信片。每个人都有一个收件人地址,并且无法保证收到订单。另一方面,像SOCK_STREAM这样的连接模式套接字使用TCP / IP,这有点像电话,因为你在一定时间内建立了连接,并且你发送的每一个东西都是按顺序传递的。

由于您的代码似乎是为通过连接进行通信而设计的,我认为您只需要c.send(数据)而不是sendto。