【问题标题】:Python Socket does not receive messagePython Socket 没有收到消息
【发布时间】:2021-08-15 01:55:53
【问题描述】:

我在 server.py 文件中建立了一个 Python 套接字,并在我的 client.py 文件中建立了一个连接到它的客户端。我第一次在命令行中运行这两个脚本时效果很好,但现在每次运行它们我都会得到:

OSError: [Errno 48] 地址已在使用中

但即使出现该错误,server.py 文件似乎仍然可以正常运行。但是,我的 client.py 文件没有收到我要发送的消息。

#server.py
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((socket.gethostname(), 1234))

s.listen(5)

while True:
    clientsocket, address = s.accept()
    print(f'Connection from {address} has been established.') 
    #this prints as expected
    clientsocket.send(bytes("Test Message", "utf-8"))

即使我收到Address is already in use error,我的打印声明也能正常工作。

#client.py
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((socket.gethostname(), 1234))


msg = s.recv(1024)

print(msg.decode("utf-8"))

我的 client.py 文件没有打印任何内容,因此我假设它没有收到消息。我怀疑它是由它给出的错误引起的,但我不确定如何修复它。

关闭所有当前连接的最佳方法是什么?另外,这与已经打开的连接有关吗?有没有办法确定消息正在发送并且我的客户正在接收它?以下是我运行脚本的方式(如果相关)。

python3 server.py & python3 client.py

【问题讨论】:

  • 我相信您正在尝试处理多个客户端连接,但只允许服务器一次处理一个客户端。您需要在服务器脚本中实现线程。如果您给我一分钟,我将能够提供答案。
  • 听起来不错,我很感激。
  • 您的代码在我这边运行良好。您确定您不只是尝试多次运行server.py 吗?尝试打开两个不同的命令提示符并分别运行每个命令。在一个终端中,运行python server.py。在另一个终端中,运行python client.py。现在,每次您在该终端中运行 client.py 时,它都应该收到消息。在您的服务器终端上,您应该会收到已建立连接的消息。
  • 我猜你是对的,如果我在程序末尾添加s.close() 并更改我的端口号,它就可以正常工作。但是因为我在使用端口 1234 时没有 s.close(),所以有没有办法可以关闭端口 1234 上的所有实例或连接,这样我就可以继续使用它们而不必担心忘记添加 s.close()未来?
  • 以防我忘记s.close(),如果我知道一种更有效的方法而不是每次运行时都必须更改端口号,那就太好了。

标签: python python-3.x websocket


【解决方案1】:

server.py,在你创建socket之后立即尝试添加:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

SOL_SOCKET 选项指定该设置以独立于协议的方式应用于套接字 API,而不是特定协议,例如 TCP。带有1 值的SO_REUSEADDR 选项允许只要套接字处于TIME_WAIT 状态,就可以重新使用地址,这意味着它已关闭,但会保留一小段时间以允许任何剩余的数据包到达并被该连接识别。如果套接字处于任何其他活动状态,您仍然会收到address already in use 错误。

这并不是解决所有套接字问题的万灵药,但如果服务器在TIME_WAIT 状态下花费的时间过长,它可能允许服务器重新绑定到端口。

【讨论】:

  • 能否简单介绍一下这个方法的参数?
  • 感谢您的帮助。我注意到,如果我将它与s.close() 一起使用,并确保退出while 循环,一切似乎都正常。我只需要确保我跳出我的循环并使用它。
【解决方案2】:

这两个文件对我来说都很好。 尝试使用其他端口而不是 1234

【讨论】:

  • 是的,它们为我工作了一次,我想我需要弄清楚如何在第二次和第三次尝试时多次调用它们而不会出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2019-08-19
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多