You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Software_Architecture/distance-judgement/test_network.py

134 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
网络连接测试脚本
帮助诊断手机/平板连接问题
"""
import socket
import subprocess
import sys
import threading
import time
from http.server import HTTPServer, SimpleHTTPRequestHandler
def get_local_ip():
"""获取本机IP地址"""
try:
# 方法1: 连接到远程地址获取本地IP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
except:
try:
# 方法2: 获取主机名对应的IP
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
if ip.startswith("127."):
return None
return ip
except:
return None
def test_port(host, port):
"""测试端口是否可访问"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
result = sock.connect_ex((host, port))
sock.close()
return result == 0
except:
return False
def start_test_server(port=8888):
"""启动测试HTTP服务器"""
class TestHandler(SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
html = """
<html><head><meta charset="utf-8"><title>网络测试</title></head>
<body style="font-family: Arial; padding: 20px; background: #f0f0f0;">
<h1 style="color: green;">✅ 网络连接测试成功!</h1>
<p>如果您能看到这个页面,说明网络连接正常。</p>
<p><strong>测试时间:</strong> %s</p>
<p><strong>您的IP:</strong> %s</p>
<p><a href="/">刷新测试</a></p>
</body></html>
""" % (time.strftime('%Y-%m-%d %H:%M:%S'), self.client_address[0])
self.wfile.write(html.encode('utf-8'))
def log_message(self, format, *args):
print(f"📱 测试访问: {self.client_address[0]} - {format % args}")
try:
server = HTTPServer(('0.0.0.0', port), TestHandler)
print(f"🧪 测试服务器已启动,端口: {port}")
server.serve_forever()
except Exception as e:
print(f"❌ 测试服务器启动失败: {e}")
def main():
print("=" * 60)
print("🔍 网络连接诊断工具")
print("=" * 60)
print()
# 1. 获取IP地址
print("📍 1. 获取网络IP地址...")
local_ip = get_local_ip()
if local_ip:
print(f"✅ 本机IP地址: {local_ip}")
else:
print("❌ 无法获取IP地址请检查网络连接")
return
# 2. 检查常用端口
print("\n🔌 2. 检查端口状态...")
ports_to_test = [5000, 8080, 8888]
for port in ports_to_test:
if test_port('127.0.0.1', port):
print(f"⚠️ 端口 {port} 已被占用")
else:
print(f"✅ 端口 {port} 可用")
# 3. 显示连接信息
print(f"\n📱 3. 移动设备连接信息:")
print(f" 主服务器地址: http://{local_ip}:5000")
print(f" 手机客户端: http://{local_ip}:5000/mobile/mobile_client.html")
print(f" 测试地址: http://{local_ip}:8888")
# 4. 防火墙检查提示
print(f"\n🛡️ 4. 防火墙设置提示:")
print(" 如果平板无法连接请检查Windows防火墙设置:")
print(" 1. 打开 Windows 安全中心")
print(" 2. 点击 防火墙和网络保护")
print(" 3. 点击 允许应用通过防火墙")
print(" 4. 确保 Python 程序被允许通过防火墙")
print(" 或者临时关闭防火墙进行测试")
# 5. 网络检查命令
print(f"\n🔧 5. 网络检查命令:")
print(f" 在平板上ping测试: ping {local_ip}")
print(f" 在电脑上查看网络: ipconfig")
print(f" 检查防火墙状态: netsh advfirewall show allprofiles")
# 6. 启动测试服务器
print(f"\n🧪 6. 启动网络测试服务器...")
print(f" 请在平板浏览器访问: http://{local_ip}:8888")
print(" 如果能看到测试页面,说明网络连接正常")
print(" 按 Ctrl+C 停止测试")
print()
try:
start_test_server(8888)
except KeyboardInterrupt:
print("\n👋 测试结束")
if __name__ == "__main__":
main()