1. 思路
使用像socket
模块,需要绑定端口号时,端口号被占用,则会导致端口号冲突。
对于频繁使用端口号,导致端口号冲突,解决方案可以是自动获取未冲突的端口号,并绑定这个端口号。
思路如下:
- 编写一个
get_port.py
脚本,内部封装一个函数get_port()
,每次调用该函数就会获取一个新的端口号,端口号递增一。 get_port()
获取的端口号给定一个范围[initPort, endPort]
,为了避免端口号冲突,这个范围不包含本机上现有的端口号。- 走完一遍从
initPort
到endPort
后,重置端口号为initPort
,复用端口号,避免获取的端口号无限递增。
2. 代码实现
新建get_port.py
文件,内容如下:
import os
portFile = 'port.txt' # 端口号文件
initPort = '10001' # 初始端口号
endPort = '10010' # 结束端口号
# 创建端口号文件,并写入初始端口号
def create_port_file():
with open(portFile, 'w') as f:
f.write(initPort)
# 获取端口号
def get_port():
if not os.path.exists(portFile): # 端口号文件不存在则创建
create_port_file()
with open(portFile, 'r') as f:
port = f.read()
update_port(port)
if port == endPort: # 重置端口号
create_port_file()
print("The current port number: {}".format(port))
return int(port)
# 更新端口号
def update_port(oldPort):
newPort = int(oldPort) + 1
with open(portFile,'w') as f:
port = f.write(str(newPort))
if __name__ == "__main__":
for i in range(15):
get_port()
运行结果如下:
The current port number: 10001
The current port number: 10002
The current port number: 10003
The current port number: 10004
The current port number: 10005
The current port number: 10006
The current port number: 10007
The current port number: 10008
The current port number: 10009
The current port number: 10010
The current port number: 10001
The current port number: 10002
The current port number: 10003
The current port number: 10004
The current port number: 10005
3. 端口号使用
在get_port.py
同级目录下新建test.py
,并导入该get_port
模块,并使用get_port()
函数。
test.py
文件内容如下:
import socket
from get_port import get_port # 导入get_port模块
s = socket.socket() # 创建socket对象
host = socket.gethostname() # 获取本地主机名
port = get_port() # 使用get_port模块的get_port()函数
s.bind((host, port)) # 绑定端口