【Python】端口号脚本,避免端口号冲突

1. 思路

使用像socket模块,需要绑定端口号时,端口号被占用,则会导致端口号冲突。

对于频繁使用端口号,导致端口号冲突,解决方案可以是自动获取未冲突的端口号,并绑定这个端口号。

思路如下:

  1. 编写一个get_port.py脚本,内部封装一个函数get_port(),每次调用该函数就会获取一个新的端口号,端口号递增一。
  2. get_port()获取的端口号给定一个范围[initPort, endPort],为了避免端口号冲突,这个范围不包含本机上现有的端口号。
  3. 走完一遍从initPortendPort后,重置端口号为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)) # 绑定端口

猜你喜欢

转载自blog.csdn.net/aidijava/article/details/127578055