Python: TypeError: str, bytes or bytearray expected, not int
Python: TypeError: str, bytes or bytearray expected, not int
我正在尝试创建一个简单的基于服务器到客户端的聊天程序,问题是当我尝试执行 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
问题是您将 sendto() 与连接模式套接字一起使用。我想你想要 c.send(data) 而不是。
详情:
sendto 的 Python 文档说 "The socket should not be connected to a remote socket, since the destination socket is specified by address." sendto 的手册页也说 "If sendto() is used on a connection-mode (SOCK_STREAM, SOCK_SEQPACKET) socket, the arguments dest_addr and addrlen are ignored (and the error EISCONN may be returned when they are not NULL and 0)." 我有点怀疑这正在发生并且 Python 误报了错误一种令人困惑的方式。
套接字接口和网络一般来说可能相当混乱,但基本上 sendto() 是为 SOCK_DGRAM 保留的,这是 UDP/IP 类型的互联网流量,您可以将其视为发送信件或明信片给收件人。每一个发出时都有一个收件人地址,并且不能保证收货顺序。另一方面,像 SOCK_STREAM 这样的连接模式套接字使用 TCP/IP 这有点像 phone 调用,因为你在一定的持续时间内建立连接,并且你发送的每件事两端按顺序送达。
由于您的代码似乎是为通过连接进行通信而设计的,我认为您只需要 c.send(data) 而不是 sendto。
我正在尝试创建一个简单的基于服务器到客户端的聊天程序,问题是当我尝试执行 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
问题是您将 sendto() 与连接模式套接字一起使用。我想你想要 c.send(data) 而不是。
详情:
sendto 的 Python 文档说 "The socket should not be connected to a remote socket, since the destination socket is specified by address." sendto 的手册页也说 "If sendto() is used on a connection-mode (SOCK_STREAM, SOCK_SEQPACKET) socket, the arguments dest_addr and addrlen are ignored (and the error EISCONN may be returned when they are not NULL and 0)." 我有点怀疑这正在发生并且 Python 误报了错误一种令人困惑的方式。
套接字接口和网络一般来说可能相当混乱,但基本上 sendto() 是为 SOCK_DGRAM 保留的,这是 UDP/IP 类型的互联网流量,您可以将其视为发送信件或明信片给收件人。每一个发出时都有一个收件人地址,并且不能保证收货顺序。另一方面,像 SOCK_STREAM 这样的连接模式套接字使用 TCP/IP 这有点像 phone 调用,因为你在一定的持续时间内建立连接,并且你发送的每件事两端按顺序送达。
由于您的代码似乎是为通过连接进行通信而设计的,我认为您只需要 c.send(data) 而不是 sendto。