首页 > 解决方案 > 由于套接字未在 Python 中连接,因此不允许发送或接收数据的请求

问题描述

我正在尝试使用套接字库在 python 中制作控制台聊天应用程序。

每当我向服务器发送消息时,服务器代码都会崩溃并显示以下消息:

OSError:[WinError 10057] 不允许发送或接收数据的请求,因为未连接套接字并且(当使用 sendto 调用在数据报套接字上发送时)未提供地址

服务器代码

import socket

HOST = socket.gethostbyname(socket.gethostname()) # get the ip address of PC
PORT = 5050

ADDRESS = (HOST, PORT)
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

socket.bind(ADDRESS)

while True:
  socket.listen()

  conn, addr = socket.accept()
  print(f"Connected by {addr}")
  while True:
    data = conn.recv(64)
    print(data.decode('utf-8'))
    socket.send(data)

客户端代码

import socket

HOST = socket.gethostbyname(socket.gethostname()) # get the ip address of PC
PORT = 5050

ADDRESS = (HOST, PORT)
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

socket.connect(ADDRESS)
while True:
  msg = input("Enter your message")
  socket.send(msg.encode('utf-8'))
  data = socket.recv(64)
  print(data.decode('utf-8'))

我想要实现的是每当我向服务器发送消息时,客户端脚本应该打印发送的消息。我该如何解决?

标签: pythonsockets

解决方案


您正在尝试将数据发送到您自己的服务器套接字。相反,您想发送给您接受的客户。

socket.send(data)

应该:

conn.send(data)

如果您考虑一下,如果您有多个客户端,您将如何向特定客户端发送数据?通过使用accept给你的套接字。


作为旁注,您可能不想将模块导入为socket,并且还调用您的变量socket。在这里很好,但是如果您要创建一个更复杂的项目,当您打算引用模块时,您可能会不小心引用了该对象。我会将socket对象重命名为sockserver_socket避免阴影。


推荐阅读