WebSocket 连通性测试方法

0 阅读4分钟

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)

最佳实践

  1. 分层测试:先测试端口连通性,再测试 HTTPS,最后测试 WebSocket
  2. 超时设置:为所有测试设置合理的超时时间
  3. 错误处理:捕获并处理各种可能的异常
  4. 日志记录:记录详细的测试过程和结果
  5. 自动化:将测试脚本集成到 CI/CD 流程中

总结

通过以上多种方法,可以全面测试 WebSocket 连接的各个层面。建议使用 wscat 进行快速测试,使用 Python 脚本进行自动化测试和集成到测试流程中。

测试结果显示,目标 WebSocket URL 可以正常访问,连接建立成功。