4

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:

  1. The manager connects to server.
  2. The clients connect to server.
  3. The manager send a message to server and server receive the message(could send OK status or response for error handling)
  4. 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: enter image description here

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.

Arta Asadi
  • 126
  • 1
  • 11

0 Answers0