appium--自動檢測端口和釋放端口


檢測端口

當端口被其他服務占用時,如果我們還啟動這個端口,則會報錯,所以很有必要在使用這個端口時,先來檢測一下這個端口有沒有被其他服務使用。

端口檢測需要用到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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM