websocket小工具

[复制链接]
81 |11
发表于 3 天前 | 显示全部楼层 |阅读模式
websocketman不注册老是自动跳到关于页面,实在受不了了,自己写了一个。  有需要的网盘自取

源码部分


https://wwtg.lanzouo.com/b026xsrlxc
密码:8n2fimport websocket
import threading
import tkinter as tk
from tkinter import scrolledtext, ttk, font
import json
  1. class WebSocketApp:
  2.     def __init__(self, root):
  3.         self.root = root
  4.         self.root.title("WebSocket 客户端")
  5.         self.ws = None
  6.         # 设置窗口大小
  7.         self.root.geometry("800x600")
  8.         self.custom_font = font.Font(family="Courier New", size=12)
  9.         # 1. WebSocket 地址输入框和连接按钮
  10.         self.url_frame = ttk.LabelFrame(root, text="连接地址", padding=10)
  11.         self.url_frame.pack(fill="x", padx=10, pady=10)
  12.         self.url_entry = tk.Entry(self.url_frame, font=self.custom_font)
  13.         self.url_entry.insert(0, "ws://127.0.0.1:8000/ws")
  14.         self.url_entry.pack(side="left", fill="x", expand=True, padx=5)
  15.         self.connect_btn = tk.Button(self.url_frame, text="开始连接", command=self.connect, font=self.custom_font)
  16.         self.connect_btn.pack(side="left", padx=5)
  17.         self.close_btn = tk.Button(self.url_frame, text="关闭连接", command=self.close, font=self.custom_font)
  18.         self.close_btn.pack(side="left", padx=5)
  19.         # 2. 发送区:文本域 + 按钮
  20.         self.send_frame = ttk.LabelFrame(root, text="发送区", padding=10)
  21.         self.send_frame.pack(fill="both", padx=10, pady=10, expand=True)
  22.         self.send_text = scrolledtext.ScrolledText(
  23.             self.send_frame,
  24.             width=60,
  25.             height=8,
  26.             font=self.custom_font,
  27.             wrap=tk.WORD,
  28.             spacing1=2,
  29.             spacing2=2,
  30.             spacing3=2,
  31.             undo=True  # 启用撤销功能
  32.         )
  33.         self.send_text.pack(side="left", fill="both", expand=True, padx=(0, 5))
  34.         # 绑定 Ctrl+Z 和 Ctrl+Y 快捷键
  35.         self.send_text.bind('', lambda event: self.send_text.edit_undo())
  36.         self.send_text.bind('', lambda event: self.send_text.edit_redo())
  37.         self.send_text.bind('', lambda event: self.send_text.tag_add(tk.SEL, "1.0", tk.END) or "break")
  38.         self.send_btn_frame = tk.Frame(self.send_frame)
  39.         self.send_btn_frame.pack(side="right", fill="y")
  40.         self.format_btn = tk.Button(self.send_btn_frame, text="格式化", command=self.format_text, font=self.custom_font)
  41.         self.format_btn.pack(pady=5)
  42.         self.send_btn = tk.Button(self.send_btn_frame, text="发送", command=self.send_message, font=self.custom_font)
  43.         self.send_btn.pack(pady=5)
  44.         self.clear_send_btn = tk.Button(self.send_btn_frame, text="清空", command=self.clear_send, font=self.custom_font)
  45.         self.clear_send_btn.pack(pady=5)
  46.         # 3. 显示区:内容展示框 + 清空按钮
  47.         self.display_frame = ttk.LabelFrame(root, text="显示区", padding=10)
  48.         self.display_frame.pack(fill="both", padx=10, pady=10, expand=True)
  49.         self.recv_text = scrolledtext.ScrolledText(
  50.             self.display_frame,
  51.             width=60,
  52.             height=15,
  53.             font=self.custom_font,
  54.             wrap=tk.WORD
  55.         )
  56.         self.recv_text.pack(side="left", fill="both", expand=True, padx=(0, 5))
  57.         self.clear_display_btn = tk.Button(self.display_frame, text="清空", command=self.clear_display, font=self.custom_font)
  58.         self.clear_display_btn.pack(side="right", pady=5)
  59.     def on_message(self, ws, message):
  60.         self.recv_text.insert(tk.END, f"收到消息: {message}\n")
  61.         self.recv_text.see(tk.END)
  62.     def on_error(self, ws, error):
  63.         self.recv_text.insert(tk.END, f"发生错误: {error}\n")
  64.         self.recv_text.see(tk.END)
  65.     def on_close(self, ws, close_status_code, close_msg):
  66.         self.recv_text.insert(tk.END, "连接已关闭\n")
  67.         self.recv_text.see(tk.END)
  68.     def on_open(self, ws):
  69.         self.recv_text.insert(tk.END, "连接已建立\n")
  70.         self.recv_text.see(tk.END)
  71.     def connect(self):
  72.         try:
  73.             ws_url = self.url_entry.get()
  74.             if not ws_url:
  75.                 self.recv_text.insert(tk.END, "请输入 WebSocket 地址\n")
  76.                 return
  77.             self.ws = websocket.WebSocketApp(ws_url,
  78.                                              on_open=self.on_open,
  79.                                              on_message=self.on_message,
  80.                                              on_error=self.on_error,
  81.                                              on_close=self.on_close)
  82.             ws_thread = threading.Thread(target=self.ws.run_forever)
  83.             ws_thread.daemon = True
  84.             ws_thread.start()
  85.         except Exception as e:
  86.             self.recv_text.insert(tk.END, f"连接失败: {e}\n")
  87.     def format_text(self):
  88.         try:
  89.             # self.send_text.edit_undo(False)  # 禁用撤销
  90.             text = self.send_text.get("1.0", tk.END).strip()
  91.             if not text:
  92.                 return
  93.             try:
  94.                 json_obj = json.loads(text)
  95.                 formatted_text = json.dumps(json_obj, indent=2, ensure_ascii=False)
  96.                 self.send_text.delete("1.0", tk.END)
  97.                 self.send_text.insert("1.0", formatted_text)
  98.             except json.JSONDecodeError:
  99.                 cleaned_text = " ".join(text.split())
  100.                 self.send_text.delete("1.0", tk.END)
  101.                 self.send_text.insert("1.0", cleaned_text)
  102.         except Exception as e:
  103.             self.recv_text.insert(tk.END, f"格式化失败: {e}\n")
  104.     def send_message(self):
  105.         if self.ws:
  106.             message = self.send_text.get("1.0", tk.END).strip()
  107.             if message:
  108.                 self.ws.send(message)
  109.                 self.recv_text.insert(tk.END, f"已发送消息: {message}\n")
  110.                 self.recv_text.see(tk.END)
  111.             else:
  112.                 self.recv_text.insert(tk.END, "发送内容不能为空\n")
  113.     def close(self):
  114.         if self.ws:
  115.             self.ws.close()
  116.             self.ws = None
  117.     def clear_send(self):
  118.         self.send_text.delete("1.0", tk.END)
  119.     def clear_display(self):
  120.         self.recv_text.delete("1.0", tk.END)
  121. if __name__ == "__main__":
  122.     root = tk.Tk()
  123.     app = WebSocketApp(root)
  124.     root.mainloop()
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
您好,想向您请教一个问题,为何我用 pyhont 3.12.10 ,用 vscode 运行后,输入正确的ip地址后,点连接,会提示以下的错误呢

连接失败: WebSocketApp.__init__() got an unexpected keyword argument 'on_open'

但如果用您的就没有问题,不晓得是不是哪里没有配置正确,您的代码我是直接复制的,并未改 。

>python --version
Python 3.12.10

谢谢
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
3.12.10经测试无上述问题
根据报错来看请您查看WebSocketApp的__init__方法是否传入了除TKroot实例之外的参数, 例如异常中提示的on_open参数
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
谢谢了,这个有什么用
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
哪方面的网站呢?
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
用于websocket连接测试
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
感谢分享,简单实用。不过在线工具也不少,留着备用。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
应该添加一个显示连接状态的模块,可以直观看到有没有连接成功
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
您好,请问这个有源码么,谢谢
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
已加上源码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表