文章目录
-
- 前言
- [1. 命令行传参](#1. 命令行传参)
- [2. 代码](#2. 代码)
前言
最近在只有python2的服务器上部署服务,不能用三方类库,这里出于好奇心学习下python。这里简单做个脚本,实现了检验网络连通性的功能(类似于curl)。
1. 命令行传参
使用命令行的目的是可以一次性检验多个url的连通性,比如上线前对接多个三方接口可以用上。
bash
python test_socket.py -u "{'https://www.baidu.com':'120.232.145.144','ws://localhost:8080/ws':'127.0.0.1','wss://hello/ws':''}"
参数解释
json
{
'https://www.baidu.com':'120.232.145.144', // 期待域名解析为120.232.145.144 否则报错
'ws://localhost:8080/ws':'127.0.0.1', // 期待域名解析为127.0.0.1 否则报错
'wss://hello/ws':'' // 无期望域名解析的ip,保证连通性即可
}
2. 代码
python
# -*- coding: utf-8 -*-
# coding:utf-8
import sys
import getopt
import socket
import urlparse
import re
def get_hostname(input_url):
if len(input_url) == 0:
return 'url为空'
hostname = urlparse.urlparse(input_url).hostname
if 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 上读端口号
input_port = urlparse.urlparse(input_url).port
if input_port:
return input_port
# url 上读不到端口号用协议类型区分
scheme = urlparse.urlparse(input_url).scheme
if scheme == 'https' or scheme == 'wss':
return 443
if scheme == 'http' or 'ws':
return 80
def check_connect(input_ip, input_port):
# 设置超时时间为3秒钟
socket.setdefaulttimeout(3)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((input_ip, input_port))
return '可联通'
except socket.timeout:
return '无法联通, 超时'
except Exception as e:
return '无法联通, 异常:' + str(e)
finally:
s.close()
# 从命令行中读取参数
opts, argv = getopt.getopt(sys.argv[1:], 'u:')
ops = dict(opts)
url_ip_dict = eval(ops.get('-u'))
# 循环参数内容进行连通性检测
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, 且入参存在ip 则校验是否是解析出来的ip
if input_ip:
if actual_ip != input_ip:
print printTemplate % (input_url, input_ip, '\\', '未能联通, 实际解析的ip为' + actual_ip)
continue
port = get_port(input_url)
# 连通性测试
result = check_connect(actual_ip, port)
print printTemplate % (input_url, actual_ip, port, result)