- 网络连通性检测:检测玩家端和服务器端之间的网络连接是否正常。
- 延迟检测:测量数据包从玩家端发送到服务器端的往返时间。
- 数据传输检测:确保数据完整传输,无数据丢失。
- 带宽检测:评估网络带宽,避免网络堵塞。
- 用户友好界面:简洁易用,适合所有用户。
以下是工具的实现步骤:
导入所需库
import socket import time import threading from tkinter import * from tkinter.messagebox import * import random
定义检测类
class NetworkTester:
def __init__(self, server_ip, server_port, filename):
self.server_ip = server_ip
self.server_port = server_port
self.filename = filename
self.results = {'status': 'Connecting...', 'ping': 0., 'delay': 0.,
'loss': 0., 'bandwidth': 0.}
实现检测功能
a. 网络连通性检测
def test_connection(self):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((self.server_ip, self.server_port))
self.results['status'] = 'Connected'
self.results['ping'] = self.ping(s)
s.close()
except:
self.results['status'] = 'Not Connected'
self.results['ping'] = 0.
self.results['delay'] = 0.
self.results['loss'] = 0.
self.results['bandwidth'] = 0.
finally:
s.close()
def ping(self, s):
start_time = time.time()
s.sendall(b'ping')
response = s.recv(1024)
if response:
return (time.time() - start_time) * 100
else:
return 0.
b. 延迟检测
def test_delay(self):
start_time = time.time()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('...', random.randint(100, 300)))
s.connect((self.server_ip, self.server_port))
s.sendall(b'test')
response = s.recv(1024)
if response:
return (time.time() - start_time) * 100
else:
return 0.
s.close()
def run_delay_test(self):
delay = self.test_delay()
self.results['delay'] = delay
if delay > 200:
self.results['status'] = 'High Delay'
elif delay < 100:
self.results['status'] = 'Low Delay'
else:
self.results['status'] = 'Normal Delay'
c. 数据传输检测
def test_data_transfer(self):
data = b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('...', random.randint(100, 300)))
s.connect((self.server_ip, self.server_port))
s.sendall(data)
received = b''
while True:
response = s.recv(1024)
if not response:
break
received += response
s.close()
if len(received) == len(data):
self.results['loss'] = 0.
self.results['status'] = 'No Loss'
else:
self.results['loss'] = (len(data) - len(received)) / len(data) * 100
self.results['status'] = f'{self.results["loss"]:.2f}% Loss'
def run_data_test(self):
self.test_data_transfer()
d. 带宽检测
def test_bandwidth(self):
size = 1024 * 1024 # 1MB
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('...', random.randint(100, 300)))
s.connect((self.server_ip, self.server_port))
s.sendall(b'*' * size)
received = b''
start_time = time.time()
while True:
response = s.recv(1024)
if not response:
break
received += response
s.close()
elapsed = time.time() - start_time
if elapsed == 0:
self.results['bandwidth'] = 0.
else:
self.results['bandwidth'] = (len(received) / elapsed) * 100
self.results['status'] = f'{self.results["bandwidth"]:.2f} Mbps'
def run_bandwidth_test(self):
self.test_bandwidth()
主函数
def main():
root = Tk()
root.title('Network Tester')
root.geometry('500x300')
server_ip = StringVar()
server_port = StringVar()
filename = StringVar()
def get_ip():
return server_ip.get().strip()
def get_port():
return int(server_port.get()) if server_port.get() else 0
def detect():
try:
if not get_ip() or not get_port():
showerror('Error', 'Please enter server IP and port')
return
nt = NetworkTester(get_ip(), get_port(), filename.get())
nt.test_connection()
nt.test_delay()
nt.test_data_transfer()
nt.test_bandwidth()
with open(filename.get(), 'w') as f:
f.write(f"检测结果:\n{'IP':nt.server_ip, 'Port':nt.server_port}\n"
f"状态: {nt.results['status']}\n"
f"延迟: {nt.results['delay']:.2f}ms\n"
f"丢包率: {nt.results['loss']:.2f}%\n"
f"带宽: {nt.results['bandwidth']:.2f}Mbps")
showinfo('完成', '检测已保存到文件')
except:
showerror('Error', '检测失败, 请检查网络连接')
Button(root, text='检测', command=detect).pack(pady=10)
Label(root, text='服务器IP地址:').pack(pady=5)
Entry(root, textvariable=server_ip).pack(pady=5)
Label(root, text='服务器端口:').pack(pady=5)
Entry(root, textvariable=server_port).pack(pady=5)
Label(root, text='保存结果文件:').pack(pady=5)
Entry(root, textvariable=filename).pack(pady=5)
root.mainloop()
使用说明
- 运行工具:运行
main()函数,界面会出现,用户可以输入服务器IP地址和端口。 - 检测功能:点击“检测”按钮,工具将执行多项检测并保存结果到指定文件。
- 结果保存:检测结果将保存为文本文件,包含网络状态、延迟、丢包率和带宽等信息。
示例输出
检测结果: IP: 192.168.1.1 Port: 808 状态: Connected 延迟: 50.00ms 丢包率: 0.00% 带宽: 100.00Mbps
可能的改进
- 多线程检测:同时检测多个服务器,提高检测效率。
- 历史记录:保存每次检测的结果,便于对比分析。
- 自动重连:在检测失败时,自动重试连接。
- 报警功能:在检测到延迟或丢包率过高时,发出警报提示。
这个工具可以根据具体需求进行调整和扩展,帮助开发者全面检测游戏网络的性能。









