WebSocket 连通性测试方法
概述
本文档总结了测试 WebSocket 连接的各种方法,包括端口连通性、HTTPS 连接和 WebSocket 握手测试。
测试目标
测试 WebSocket URL: wss://echo.websocket.org
测试方法
1. 使用 wscat 工具(推荐)
wscat 是一个专门用于测试 WebSocket 连接的命令行工具。
# 安装 wscat(如果未安装)
npm install -g wscat
# 测试 WebSocket 连接
wscat -c "wss://echo.websocket.org"
# 带超时的测试
timeout 10 wscat -c "wss://echo.websocket.org"
优点:
- 简单易用
- 专门为 WebSocket 设计
- 支持交互式测试
2. 使用 Python 脚本
2.1 基础连通性测试
#!/usr/bin/env python3
import socket
import ssl
import sys
def test_basic_connectivity():
"""测试基本端口连通性"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
result = sock.connect_ex(('echo.websocket.org', 443))
if result == 0:
print("✓ 端口 443 可以连接")
sock.close()
return True
else:
print("✗ 端口 443 无法连接")
sock.close()
return False
except Exception as e:
print(f"✗ 连接测试失败: {e}")
return False
if __name__ == "__main__":
test_basic_connectivity()
2.2 HTTPS 连接测试
#!/usr/bin/env python3
import socket
import ssl
def test_https_connection():
"""测试 HTTPS 连接"""
try:
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
wrapped_socket = context.wrap_socket(sock, server_hostname='echo.websocket.org')
wrapped_socket.connect(('echo.websocket.org', 443))
print("✓ HTTPS 连接成功")
wrapped_socket.close()
return True
except Exception as e:
print(f"✗ HTTPS 连接失败: {e}")
return False
if __name__ == "__main__":
test_https_connection()
2.3 完整 WebSocket 测试
#!/usr/bin/env python3
import websocket
import ssl
import sys
def test_websocket():
"""测试 WebSocket 连接"""
url = "wss://echo.websocket.org"
print(f"测试 WebSocket URL: {url}")
def on_open(ws):
print("✓ WebSocket 连接成功建立!")
ws.close()
def on_error(ws, error):
print(f"✗ WebSocket 连接错误: {error}")
def on_close(ws, close_status_code, close_msg):
print("✓ WebSocket 连接已关闭")
try:
ws = websocket.WebSocketApp(
url,
on_open=on_open,
on_error=on_error,
on_close=on_close
)
# 忽略 SSL 证书验证
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
return True
except Exception as e:
print(f"✗ 测试失败: {e}")
return False
if __name__ == "__main__":
success = test_websocket()
sys.exit(0 if success else 1)
安装依赖:
pip install websocket-client
3. 使用系统工具
3.1 使用 curl 测试端口
# 测试 HTTPS 端口(注意:curl 不支持 wss 协议)
curl -I https://echo.websocket.org
# 测试端口连通性
curl -v telnet://echo.websocket.org
3.2 使用 telnet 测试端口
# 测试端口连通性
telnet echo.websocket.org 443
# 带超时的测试
timeout 5 telnet echo.websocket.org 443
3.3 使用 netcat (nc) 测试端口
# 测试端口连通性
nc -zv echo.websocket.org 443
# 带超时的测试
timeout 5 nc -zv echo.websocket.org 443
3.4 使用 nmap 扫描端口
# 扫描特定端口
nmap -p 443 echo.websocket.org
# 扫描端口范围
nmap -p 80-443 echo.websocket.org
测试结果解读
成功指标
- ✅ 端口连通性:能够成功连接到目标端口
- ✅ HTTPS 连接:SSL/TLS 握手成功
- ✅ WebSocket 握手:WebSocket 协议升级成功
常见错误及解决方案
| 错误类型 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 网络不通或端口关闭 | 检查网络连接和防火墙设置 |
| SSL 证书错误 | 证书验证失败 | 使用 ssl.CERT_NONE 忽略证书验证 |
| 协议不支持 | 工具不支持 WebSocket | 使用专门的 WebSocket 测试工具 |
| 认证失败 | Token 无效或过期 | 检查认证参数 |
自动化测试脚本
综合测试脚本
#!/usr/bin/env python3
import socket
import ssl
import websocket
import sys
def comprehensive_websocket_test():
"""综合 WebSocket 测试"""
url = "wss://echo.websocket.org"
print(f"正在测试 WebSocket URL: {url}")
print("=" * 60)
# 1. 端口连通性测试
print("1. 测试端口连通性...")
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
result = sock.connect_ex(('echo.websocket.org', 443))
if result == 0:
print(" ✓ 端口 443 可以连接")
sock.close()
else:
print(" ✗ 端口 443 无法连接")
return False
except Exception as e:
print(f" ✗ 端口连通性测试失败: {e}")
return False
# 2. HTTPS 连接测试
print("\n2. 测试 HTTPS 连接...")
try:
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
wrapped_socket = context.wrap_socket(sock, server_hostname='echo.websocket.org')
wrapped_socket.connect(('echo.websocket.org', 443))
print(" ✓ HTTPS 连接成功")
wrapped_socket.close()
except Exception as e:
print(f" ✗ HTTPS 连接失败: {e}")
return False
# 3. WebSocket 握手测试
print("\n3. 测试 WebSocket 握手...")
try:
def on_open(ws):
print(" ✓ WebSocket 连接成功建立")
ws.close()
def on_error(ws, error):
print(f" ✗ WebSocket 连接错误: {error}")
def on_close(ws, close_status_code, close_msg):
print(" ✓ WebSocket 连接已关闭")
ws = websocket.WebSocketApp(
url,
on_open=on_open,
on_error=on_error,
on_close=on_close
)
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
return True
except Exception as e:
print(f" ✗ WebSocket 握手失败: {e}")
return False
if __name__ == "__main__":
success = comprehensive_websocket_test()
print("\n" + "=" * 60)
if success:
print("✓ WebSocket URL 测试完成 - 连接正常")
else:
print("✗ WebSocket URL 测试失败 - 连接异常")
sys.exit(0 if success else 1)
最佳实践
- 分层测试:先测试端口连通性,再测试 HTTPS,最后测试 WebSocket
- 超时设置:为所有测试设置合理的超时时间
- 错误处理:捕获并处理各种可能的异常
- 日志记录:记录详细的测试过程和结果
- 自动化:将测试脚本集成到 CI/CD 流程中
总结
通过以上多种方法,可以全面测试 WebSocket 连接的各个层面。建议使用 wscat 进行快速测试,使用 Python 脚本进行自动化测试和集成到测试流程中。
测试结果显示,目标 WebSocket URL 可以正常访问,连接建立成功。