【问题标题】:Python: TypeError: str, bytes or bytearray expected, not intPython: TypeError: str, bytes or bytearray expected, not int
【发布时间】:2017-05-17 21:15:19
【问题描述】:

我正在尝试创建一个简单的服务器到基于客户端的聊天程序,问题是当我尝试执行 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

【问题讨论】:

  • 似乎服务器在引发错误之前打印了两个客户端,好像您的最终for循环运行一次没有任何问题然后崩溃,您可以确认一下吗?
  • 只是猜测,如果你设置client[0] = str(client[0]),它会做什么?
  • @Trolldejo 不,它只在同一个周期打印两次,我现在无法编辑我的代码,但会按照你的建议做。
  • 那么第二个 print 在哪里调用?我建议您在 c.sendto() 下方也进行打印,以确保..
  • 打印客户端[0] 与打印客户端相同,因为它是数组中的唯一项。

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


【解决方案1】:

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

详情:

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

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

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

【讨论】:

  • 但是在这种情况下,数据不能被发送回其他客户端,只有发送消息的客户端。
  • nvm 我切换到 SOCK_DGRAM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2020-11-07
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
相关资源
最近更新 更多