做美直播網(wǎng)站設(shè)計(jì)網(wǎng)頁(yè)
文章目錄
- 前言
- 1. 命令行傳參
- 2. 代碼
前言
最近在只有python2的服務(wù)器上部署服務(wù),不能用三方類庫(kù),這里出于好奇心學(xué)習(xí)下python。這里簡(jiǎn)單做個(gè)腳本,實(shí)現(xiàn)了檢驗(yàn)網(wǎng)絡(luò)連通性的功能(類似于curl)。
1. 命令行傳參
使用命令行的目的是可以一次性檢驗(yàn)多個(gè)url的連通性,比如上線前對(duì)接多個(gè)三方接口可以用上。
python test_socket.py -u "{'https://www.baidu.com':'120.232.145.144','ws://localhost:8080/ws':'127.0.0.1','wss://hello/ws':''}"
參數(shù)解釋
{'https://www.baidu.com':'120.232.145.144', // 期待域名解析為120.232.145.144 否則報(bào)錯(cuò)'ws://localhost:8080/ws':'127.0.0.1', // 期待域名解析為127.0.0.1 否則報(bào)錯(cuò)'wss://hello/ws':'' // 無(wú)期望域名解析的ip,保證連通性即可
}
2. 代碼
# -*- coding: utf-8 -*-# coding:utf-8
import sys
import getopt
import socket
import urlparse
import redef get_hostname(input_url):if len(input_url) == 0:return 'url為空'hostname = urlparse.urlparse(input_url).hostnameif hostname is None:return '域名解析為空'try:return socket.gethostbyname(hostname)except socket.error:return '域名解析異常'def get_port(input_url):if len(input_url) == 0:return 'url為空'# url 上讀端口號(hào)input_port = urlparse.urlparse(input_url).portif input_port:return input_port# url 上讀不到端口號(hào)用協(xié)議類型區(qū)分scheme = urlparse.urlparse(input_url).schemeif scheme == 'https' or scheme == 'wss':return 443if scheme == 'http' or 'ws':return 80def check_connect(input_ip, input_port):# 設(shè)置超時(shí)時(shí)間為3秒鐘socket.setdefaulttimeout(3)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:s.connect((input_ip, input_port))return '可聯(lián)通'except socket.timeout:return '無(wú)法聯(lián)通, 超時(shí)'except Exception as e:return '無(wú)法聯(lián)通, 異常:' + str(e)finally:s.close()# 從命令行中讀取參數(shù)
opts, argv = getopt.getopt(sys.argv[1:], 'u:')
ops = dict(opts)
url_ip_dict = eval(ops.get('-u'))# 循環(huán)參數(shù)內(nèi)容進(jìn)行連通性檢測(cè)
print "-"*150
printTemplate = "%-60s %-20s %-20s %-50s"
print printTemplate % ('url', 'ip', 'port', 'result')
print "-"*150
for input_url, input_ip in url_ip_dict.iteritems():# 域名解析actual_ip = get_hostname(input_url)# 未能解析出ip為異常if not re.match(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', input_ip):print printTemplate % (input_url, '\\', '\\', actual_ip)continue# 解析出ip, 且入?yún)⒋嬖趇p 則校驗(yàn)是否是解析出來(lái)的ipif input_ip:if actual_ip != input_ip:print printTemplate % (input_url, input_ip, '\\', '未能聯(lián)通, 實(shí)際解析的ip為' + actual_ip)continueport = get_port(input_url)# 連通性測(cè)試result = check_connect(actual_ip, port)print printTemplate % (input_url, actual_ip, port, result)