檢測端口
當端口被其他服務占用時,如果我們還啟動這個端口,則會報錯,所以很有必要在使用這個端口時,先來檢測一下這個端口有沒有被其他服務使用。
端口檢測需要用到socket模塊來校驗端口是否被占用
什么是socket?
網絡上的兩個程序通信,底層都是使用socket來實現的。socket的本質是編程接口,對TCP/IP的封裝。
shutdown(flag) 禁止在 一個socket上進行數據的接收與發送,利用shutdown函數使socket雙向數據傳輸變為單項數據傳輸, shutdown()需要一個單獨的參數,該參數表示如果關閉socket
- 0表示禁止以后讀
- 1表示禁止以后寫
- 2表示禁止以后讀和寫
import socket def check_port(host, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((host, port)) s.shutdown(2) except OSError as e: print('端口沒有被其他服務占用,可以使用') print(e) else: print('端口被其他服務占用了') if __name__ == '__main__': check_port(host='127.0.0.1', port=4723) # port不能是字符串
當我們啟動appium服務,並且端口是4723時,提示我們
端口被其他服務占用了
當端口沒有被其他服務使用時提示
端口沒有被其他服務占用,可以使用
[WinError 10061] 由於目標計算機積極拒絕,無法連接。
這時候我們就可以使用4723端口了
自動釋放端口
前面我們說了關閉端口的兩種方式,第一種是在資源管理器中關閉,第二種是使用命令關閉,不管是哪種方式,都需要我們手動去執行,對於做自動化的老司機來說,這肯定不行的,接下來讓我們使用腳本來關閉
import os # 釋放端口 def release_port(port): # 執行命令 cmd_find = 'netstat -aon | findstr %s' % (port) print('cmd_find', cmd_find) # 返回執行后的結果 res = os.popen(cmd_find).read() print('res', res) if str(port) and 'LISTENING' in res: # 獲取端口的pid i = res.index('LISTENING') # LISTENTING的索引 start = i + len('LISTENING') + 7 end = res.index('\n') pid = res[start:end] print('pid:', pid) # 關閉被占用端口的pid cmd_kill = 'taskkill -f -pid %s' % (pid) print('cmd_kill:', cmd_kill) os.popen(cmd_kill) # 關閉端口 else: print('當前端口是可以使用的') if __name__ == '__main__': release_port(4727)
結果:
cmd_find netstat -aon | findstr 4727 res TCP 0.0.0.0:4727 0.0.0.0:0 LISTENING 3056 pid: 3056 cmd_kill: taskkill -f -pid 3056