python - 由于套接字未在 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'))
我想要实现的是每当我向服务器发送消息时,客户端脚本应该打印发送的消息。我该如何解决?
解决方案
您正在尝试将数据发送到您自己的服务器套接字。相反,您想发送给您接受的客户。
socket.send(data)
应该:
conn.send(data)
如果您考虑一下,如果您有多个客户端,您将如何向特定客户端发送数据?通过使用accept
给你的套接字。
作为旁注,您可能不想将模块导入为socket
,并且还调用您的变量socket
。在这里很好,但是如果您要创建一个更复杂的项目,当您打算引用模块时,您可能会不小心引用了该对象。我会将socket
对象重命名为sock
或server_socket
避免阴影。
推荐阅读
- tensorflow - 理解 Tensorflow Keras 层的计算图
- go - 遍历对数组
- javascript - 用远程文件中的 JSON 替换教程代码中的数据
- javascript - 如何将 ruby 正则表达式转换为 javascript 正则表达式?
- authentication - 内置认证机制——API网关
- docker - 无法在 Kubernetes 上挂载 Splunk 配置 - 错误:无法读取“/opt/splunk/etc/splunk-launch.conf
- apache - 使用 docker-compose 和 dockerised apache2 在生产服务器中使用 SSL
- bash - 如何在特定字符串后从 IP:PORT 中提取端口?
- concatenation - 如何将多组列连接成几个新列?
- python - 异步下载例程中的错误处理