gpt4 book ai didi

python - socket.sock().bind() 地址已被使用

转载 作者:行者123 更新时间:2023-12-01 06:50:24 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的服务器客户端模型来完成文件传输任务。我的 server.py 和 client.py 如下所示:

<Server.py>
import socket

s = socket.socket()
host = socket.gethostname()
port = 1717
s.bind((host, port))
s.listen(1)
print(host)
print("Waiting for the client ...")

conn, addr = s.accept()
print(addr, "Connected!")

filename = "My file name"
file = open(filename, 'rb')
file_data = file.read(2048)
conn.send(file_data)
print("File has been sent to server.")
s.close()
<Client.py>
import socket
import time

time.sleep(3)

s = socket.socket()
host = "ubuntu"
port = 1717
s.connect((host, port))
print("Connected ....")

filename = "My file name"
file = open(filename, 'wb')
file_data = s.recv(2048)
file.write(file_data)
file.close()
print("File has been received.")

另外,我编写了一个shell文件来运行服务器和客户端,因为只有服务器在客户端之前运行,我才能得到没有错误的信息,我在shell脚本中编写了如下内容:

python3 ./some_path/server.py &
python3 ./some_path/client.py $n

请注意,我还在 Client.py 的开头添加了 time.sleep(3),因为我发现我编写的 shell 脚本命令不能保证服务器首先运行。现在这个问题已经解决了,但是,每次我想第二次运行整个过程时,由于 server.py 中的 s.bind() ,我都会收到“地址已在使用中”错误。这就是说,如果我打开 Ubuntu,并运行 shell 脚本,它就会正常工作,一切都按预期进行。但是当它完成并且我想再次运行时,我会得到“地址已在使用中”。

所以我的问题是:

  1. 如何解决这个问题,以便我在不重新启动整个计算机的情况下测试功能。

  2. 有没有比我的 time.sleep() 方法更复杂的方法来使 client.py 始终在 server.py 之后运行?

  3. 有没有更复杂的方法来获取主机名而不是提前指定?正如您从 client.py 中看到的,我基本上将主机设置为“ubuntu”,因为如果我从服务器端打印主机名,我就会得到这个结果。

非常感谢您阅读这些长问题...我只是想让事情变得更清楚...如果您能回答我的任何一个问题,甚至提出一些建议,我将不胜感激。顺便说一句,我正在 ubuntu 14.04 机器上测试所有这些。

最佳答案

首先,您还需要关闭客户端中的套接字。其次,您应该在关闭套接字之前调用 shutdown 。

请参阅此https://stackoverflow.com/a/598759/6625498

关于python - socket.sock().bind() 地址已被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59041551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com