timmy revisó este gist 10 months ago. Ir a la revisión
Sin cambios
timmy revisó este gist 10 months ago. Ir a la revisión
Sin cambios
timmy revisó este gist 10 months ago. Ir a la revisión
Sin cambios
timmy revisó este gist 10 months ago. Ir a la revisión
1 file changed, 55 insertions
websocket_streamlit_app.py(archivo creado)
| @@ -0,0 +1,55 @@ | |||
| 1 | + | import asyncio | |
| 2 | + | import websockets | |
| 3 | + | import streamlit as st | |
| 4 | + | import threading | |
| 5 | + | import socket | |
| 6 | + | ||
| 7 | + | # Function to check if a port is free | |
| 8 | + | def is_port_free(port): | |
| 9 | + | with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: | |
| 10 | + | return s.connect_ex(('localhost', port)) != 0 | |
| 11 | + | ||
| 12 | + | # WebSocket Server Logic | |
| 13 | + | async def echo(websocket, path): | |
| 14 | + | async for message in websocket: | |
| 15 | + | print(f"收到訊息: {message}") | |
| 16 | + | await websocket.send(f"伺服器回應: {message}") | |
| 17 | + | ||
| 18 | + | # Function to start the WebSocket server | |
| 19 | + | def start_server(): | |
| 20 | + | new_loop = asyncio.new_event_loop() | |
| 21 | + | asyncio.set_event_loop(new_loop) | |
| 22 | + | server = websockets.serve(echo, "localhost", 8765) | |
| 23 | + | new_loop.run_until_complete(server) | |
| 24 | + | new_loop.run_forever() | |
| 25 | + | ||
| 26 | + | # Initialize session state for server | |
| 27 | + | if 'server_started' not in st.session_state: | |
| 28 | + | st.session_state.server_started = False | |
| 29 | + | ||
| 30 | + | # Start the server only once | |
| 31 | + | if not st.session_state.server_started: | |
| 32 | + | if is_port_free(8765): | |
| 33 | + | server_thread = threading.Thread(target=start_server, daemon=True) | |
| 34 | + | server_thread.start() | |
| 35 | + | st.session_state.server_started = True | |
| 36 | + | st.success("WebSocket 伺服器已啟動。") | |
| 37 | + | else: | |
| 38 | + | st.error("Port 8765 已被佔用。請確保沒有其他應用程式使用該埠,或更改埠號。") | |
| 39 | + | ||
| 40 | + | st.title("WebSocket Example") | |
| 41 | + | ||
| 42 | + | # WebSocket Client Logic | |
| 43 | + | async def websocket_client(): | |
| 44 | + | try: | |
| 45 | + | async with websockets.connect("ws://localhost:8765") as websocket: | |
| 46 | + | await websocket.send("你好,WebSocket!") | |
| 47 | + | response = await websocket.recv() | |
| 48 | + | st.write(f"伺服器回應: {response}") | |
| 49 | + | except Exception as e: | |
| 50 | + | st.error(f"WebSocket 連線失敗: {e}") | |
| 51 | + | ||
| 52 | + | # Run WebSocket Client on Button Click | |
| 53 | + | if st.button("發送訊息"): | |
| 54 | + | asyncio.run(websocket_client()) | |
| 55 | + | ||
Siguiente
Anterior