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

标签 python linux shell sockets ubuntu-14.04

我正在尝试构建一个简单的服务器客户端模型来完成文件传输任务。我的 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/

相关文章:

python - Tkinter 文本 : Setting tab spaces not working

c - lirpm - 如何验证已安装包的签名 key

bash - 用法 : command not found

python - 在 numpy 中,如何有效地列出所有固定大小的子矩阵?

python - 使用 Django 24 小时后软删除

Python 列表到 Pandas 数据框的字典

linux - SVN 导出命令成功运行但文件未出现在目标路径中

linux - SNMP 管理树莓派

linux - Vlc radio 发射器

linux - 通过 FIFO 重定向标准输入