Python套接字没有收到消息
Python Socket does not receive message
我在 server.py 文件中建立了一个 Python 套接字,在我的 client.py 文件中有一个连接到它的客户端。第一次我在我的命令行中 运行 两个脚本时它工作正常,但现在每次我 运行 它们我得到:
OSError: [Errno 48] Address is already in use
但是 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
这两个文件对我来说都很好用。
尝试使用另一个端口而不是 1234
在 server.py
中,创建套接字后立即尝试添加:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
SOL_SOCKET
选项指定该设置以独立于协议的方式应用于套接字 API,而不是特定的协议,例如 TCP。值为 1
的 SO_REUSEADDR
选项允许在套接字处于 TIME_WAIT
状态时重新使用该地址,这意味着它已关闭,但正在等待片刻以允许任何剩余的数据包到达并通过该连接被识别。如果套接字处于任何其他活动状态,您仍然会收到 address already in use
错误。
这不是解决所有套接字问题的灵丹妙药,但如果服务器处于 TIME_WAIT
状态的时间过长,它可能允许服务器重新绑定到端口。
我在 server.py 文件中建立了一个 Python 套接字,在我的 client.py 文件中有一个连接到它的客户端。第一次我在我的命令行中 运行 两个脚本时它工作正常,但现在每次我 运行 它们我得到:
OSError: [Errno 48] Address is already in use
但是 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
这两个文件对我来说都很好用。
尝试使用另一个端口而不是 1234
在 server.py
中,创建套接字后立即尝试添加:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
SOL_SOCKET
选项指定该设置以独立于协议的方式应用于套接字 API,而不是特定的协议,例如 TCP。值为 1
的 SO_REUSEADDR
选项允许在套接字处于 TIME_WAIT
状态时重新使用该地址,这意味着它已关闭,但正在等待片刻以允许任何剩余的数据包到达并通过该连接被识别。如果套接字处于任何其他活动状态,您仍然会收到 address already in use
错误。
这不是解决所有套接字问题的灵丹妙药,但如果服务器处于 TIME_WAIT
状态的时间过长,它可能允许服务器重新绑定到端口。