Broadcasting a message from a manager to clients in websocket using fastapi
Broadcasting a message from a manager to clients in websocket using fastapi
Loading saved threads...
Arta Asadi · External communityPost link
External question — Stack Overflow Stack Exchange
Author: Arta Asadi
Original post: https://stackoverflow.com/questions/71827145
License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/
Adaptation: HTML converted to plain text; contact email addresses removed.
I want to make a websocket server using Fastapi then get a message from a manager then broadcast it to all clients.
The messages are just text.
Here is the process:
The manager connects to server.
The clients connect to server.
The manager send a message to server and server receive the message(could send OK status or response for error handling)
The server broadcast the message to all clients(no matter to manager or not)
The manager and clients are preferred to be MQL4/5 Experts.
A simple topology of the system:
The server is using fastapi sockets
FastAPI websocket
The simple server code like
The manager of system
:
from typing import List
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
app = FastAPI()
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def send_personal_message(self, message: str, websocket: WebSocket):
await websocket.send_text(message)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.get("/")
async def get():
return (f"Hi!")
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.send_personal_message(f"You wrote: {data}", websocket)
await manager.broadcast(f"Client #{client_id} says: {data}")
except WebSocketDisconnect:
manager.disconnect(websocket)
await manager.broadcast(f"Hello everyone")
The connection manager in the above code can broadcast a message to all client(in that case, it is used for disconnection handling, but it is not my case).
Also, a sample piece of code for the client in MQL5:
int socket=SocketCreate();
if(socket!=INVALID_HANDLE)
{
if(SocketConnect(socket,"127.0.0.1",9091,1000)) {
Print("Connected to "," 127.0.0.1",":",9091);
string tosend = "heartbeat";
string received = socksend(socket, tosend) ? socketreceive(socket, 10) : "";
Print(received);
string sep="_"; // A separator as a character
ushort u_sep; // The code of the separator character
string result[]; // An array to get strings
u_sep=StringGetCharacter(sep,0);
//--- Split the string to substrings
int k=StringSplit(received,u_sep,result);
Print(result[0]);
Print(result[1]);
Print(result[2]);
}
}
//---
bool socksend(int sock,string request) {
char req[];
int len=StringToCharArray(request,req)-1;
if(len<0) return(false);
return(SocketSend(sock,req,len)==len);
}
//---
string socketreceive(int sock,int timeout) {
char rsp[];
string result="";
uint len;
uint timeout_check=GetTickCount()+timeout;
do {
len=SocketIsReadable(sock);
if(len) {
int rsp_len;
rsp_len=SocketRead(sock,rsp,len,timeout);
if(rsp_len>0) {
result+=CharArrayToString(rsp,0,rsp_len);
}
}
} while((GetTickCount()<timeout_check) && !IsStopped());
return result;
}
I want to know how can I connect the manager to system the get it's message and broadcast it.
I want to know how can I make the system.
Quote
Report
Post Reply
Quoted from Forex.com.bd-Editorial External question — Stack Overflow Stack Exchange Author: Arta Asadi Source score (net votes, not local likes): 4 Original post: https://stackoverflow.com/questions/71827145 License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/ Adaptation: HTML converted to plain text; contact email addresses removed. I want to make a websocket server using Fastapi then get a message from a manager then broadcast it to all clients. The messages are just text. Here is the process: The manager connects to server. The clients connect to server. The manager send a message to server and server receive the message(could send OK status or response for error handling) The server broadcast the message to all clients(no matter to manager or not) The manager and clients are preferred to be MQL4/5 Experts. A simple topology of the system: The server is using fastapi sockets FastAPI websocket The simple server code like The manager of system : from typing import List from fastapi import FastAPI, WebSocket, WebSocketDisconnect from fastapi.responses import HTMLResponse app = FastAPI() class ConnectionManager: def __init__(self): self.active_connections: List[WebSocket] = [] async def connect(self, websocket: WebSocket): await websocket.accept() self.active_connections.append(websocket) def disconnect(self, websocket: WebSocket): self.active_connections.remove(websocket) async def send_personal_message(self, message: str, websocket: WebSocket): await websocket.send_text(message) async def broadcast(self, message: str): for connection in self.active_connections: await connection.send_text(message) manager = ConnectionManager() @app.get("/") async def get(): return (f"Hi!") @app.websocket("/ws/{client_id}") async def websocket_endpoint(websocket: WebSocket, client_id: int): await manager.connect(websocket) try: while True: data = await websocket.receive_text() await manager.send_personal_message(f"You wrote: {data}", websocket) await manager.broadcast(f"Client #{client_id} says: {data}") except WebSocketDisconnect: manager.disconnect(websocket) await manager.broadcast(f"Hello everyone") The connection manager in the above code can broadcast a message to all client(in that case, it is used for disconnection handling, but it is not my case). Also, a sample piece of code for the client in MQL5: int socket=SocketCreate(); if(socket!=INVALID_HANDLE) { if(SocketConnect(socket,"127.0.0.1",9091,1000)) { Print("Connected to "," 127.0.0.1",":",9091); string tosend = "heartbeat"; string received = socksend(socket, tosend) ? socketreceive(socket, 10) : ""; Print(received); string sep="_"; // A separator as a character ushort u_sep; // The code of the separator character string result[]; // An array to get strings u_sep=StringGetCharacter(sep,0); //--- Split the string to substrings int k=StringSplit(received,u_sep,result); Print(result[0]); Print(result[1]); Print(result[2]); } } //--- bool socksend(int sock,string request) { char req[]; int len=StringToCharArray(request,req)-1; if(len<0) return(false); return(SocketSend(sock,req,len)==len); } //--- string socketreceive(int sock,int timeout) { char rsp[]; string result=""; uint len; uint timeout_check=GetTickCount()+timeout; do { len=SocketIsReadable(sock); if(len) { int rsp_len; rsp_len=SocketRead(sock,rsp,len,timeout); if(rsp_len>0) { result+=CharArrayToString(rsp,0,rsp_len); } } } while((GetTickCount()<timeout_check) && !IsStopped()); return result; } I want to know how can I connect the manager to system the get it's message and broadcast it. I want to know how can I make the system.
Checking account access…