來自APP Android端自動化測試初學者的筆記,寫的不對的地方大家多多指教哦
什么是socket?
網(wǎng)絡上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket。建立網(wǎng)絡通信連接至少要一對端口號(socket)。
例如當你用瀏覽器打開百度主頁時,你的瀏覽器會創(chuàng)建一個socket并命令它去連接百度的服務器主機,服務器也對客戶端的請求創(chuàng)建一個socket進行監(jiān)聽。兩端使用各自的socket來發(fā)送和接收信息。在socket通信的時候,每個socket都被綁定到一個特定的IP地址和端口。
一、檢測端口是否被占用
代碼實現(xiàn)
# 檢測appium端口是否被占用
import socket
def check_port_use(host, port):
"""檢測指定的端口是否被占用"""
# 創(chuàng)建socket對象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host, port))
s.shutdown(2)
except OSError as msg:
print('port %s is available! ' % port)
print(msg)
return True
else:
print('port %s already be in use !' % port)
return False
# 測試函數(shù),在實際運行過程中可以注釋
if __name__ == '__main__':
host = '127.0.0.1'
port = 4723
check_port_use(host, port)
當端口可以使用時,控制臺輸出如下:此時說明服務端沒有開啟這個端口服務,所以可用。

image.png
當端口不能使用時,控制臺輸出如下:此時說明服務端已經(jīng)開啟這個端口服務,所以該端口被占用。

image.png
對以上代碼封裝成類
# 見測appium端口是否被占用
import socket
class CheckPortUse:
"""檢測指定的端口是否被占用"""
def use_port(self, host, port):
# 創(chuàng)建socket對象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 檢測是否被占用
try:
s.connect((host, int(port)))
s.shutdown(2)
# 未占用
except OSError as msg:
print('port %s is available! ' % port)
print(msg)
return True
# 端口被占用
else:
print('port %s already be in use !' % port)
return False
# 測試函數(shù),在實際運行過程中可以注釋
if __name__ == '__main__':
host = '127.0.0.1'
port = 4723
check_port = CheckPortUse()
check_port.use_port(host, port)
二、釋放占用的端口
代碼實現(xiàn)
# 釋放被占用的appium端口
import os
def release_port(port):
"""釋放指定的端口"""
# 查找對應端口的pid
cmd_find = 'netstat -aon | findstr %s' % port
print(cmd_find)
# 返回命令執(zhí)行后的結(jié)果
result = os.popen(cmd_find).read()
print(result)
if str(port) and 'LISTENING' in result:
# 獲取端口對應的pid進程
i = result.index('LISTENING')
start = i + (len('LISTENING') + 7)
end = result.index('\\n')
pid = result[start:end]
# 關閉被占用端口的pid
cmd_kill = ('taskkill -f -pid {0}'.format(str(pid)))
print(cmd_kill)
os.popen(cmd_kill)
else:
print('port %s is available !' % port)
# 測試函數(shù),在實際運行過程中可以注釋
if __name__ == '__main__':
host = '127.0.0.1'
port = 4723
release_port(port)
當端口被釋放后,控制臺輸出如下:此時說明服務端的端口已被釋放,可以使用。

image.png
對以上代碼封裝成類
# 釋放被占用的appium端口
import os
class CheckPortRelease:
"""釋放指定的端口"""
def release_port(self, port):
# 查找對應端口的pid
cmd_find = ('netstat -aon | findstr %s' % port)
print(cmd_find)
# 返回命令執(zhí)行后的結(jié)果
result = os.popen(cmd_find).read()
print(result)
# 如果端口被占用,則發(fā)送指令釋放端口
if str(port) and 'LISTENING' in result:
# 獲取端口對應的pid進程
i = result.index('LISTENING')
start = i + (len('LISTENING') + 7)
end = result.index('\\n')
pid = result[start:end]
# 關閉被占用端口的pid
cmd_kill = ('taskkill -f -pid {0}'.format(str(pid)))
print(cmd_kill)
os.popen(cmd_kill)
# 若端口沒有被占用,則輸出以下內(nèi)容
else:
print('port %s is available !' % port)
# 測試函數(shù),在實際運行過程中可以注釋
if __name__ == '__main__':
# host = '127.0.0.1'
port = 4723
check_port_release = CheckPortRelease()
check_port_release.release_port(port)