Wslink permite o comunicare usoara si bidirectionala intre un server python si un client javascript sau C ++ printr-un websocket. Clientul poate efectua apeluri de procedura la distanta (RPC) catre server, iar serverul poate publica mesaje la subiecte la care clientul se poate abona. Serverul poate include atasamente binare in aceste mesaje, care sunt comunicate ca un mesaj web binar, evitand cheltuielile generale de codificare si decodare.

RPC si publicati / abonati-va

Utilizatorii initiali ai wslink care conduc dezvoltarea acestuia sunt VTK si ParaViewWeb. ParaViewWeb si vtkWeb necesita:

  • RPC – un apel de procedura la distanta care poate fi declansat de client si returnat mai tarziu cu un raspuns de la server, posibil o eroare.

  • Publicare / abonare – clientul se poate abona la un subiect furnizat de server, eventual cu un filtru pe partile de interes. Cand subiectul are rezultate actualizate, serverul le publica catre client, fara alte actiuni din partea clientului.

Wslink inlocuieste un strat de comunicare bazat pe Autobahn WAMP, astfel incat unul dintre obiective este sa fim destul de compatibili cu WAMP, dar simplificam interfata cu comunicarea punct-la-punct pe care o folosim de fapt.

Exemple

  • Configurati un Python (2.7 sau 3.5+) virtualenv folosind requirements.txt. Aproximativ:
    • cd wslink / python
    • pip instala virtualenv
    • virtualenv runtime_37
    • runtime_37 sursa / Scripturi / activate (pe Windows)
    • pip install -r requirements.txt
    • pip install -e. (pentru a utiliza wslink curent pentru dezvoltare)
  • Instalati node.js 6+ pentru clientul javascript
  • cd wslink / js
  • npm test de rulare
    • sau:
  • npm run build: exemplu
  • cd ../python
  • exemple python / webserver.py
    • porneste un server web la localhost cu butoane pentru a testa metodele RPC si pub / sub
  • python examples / simple.py –content ../js/dist/examples
    • porneste acelasi exemplu folosind serverul configurabil

Testarea

API existent

Aplicatiile existente ParaViewWeb folosesc aceste modele de cod:

  • @exportRPC decorator in codul serverului Python pentru a inregistra o metoda ca apelabila de la distanta
  • session.call (“method.uri”, [args]) in clientul JavaScript pentru a efectua un apel RPC. De obicei, infasurat ca metoda obiect, astfel incat pare a fi o metoda de clasa normala.
  • session.subscribe (“method.uri”, callback) in clientul JS pentru a initia o relatie pub / sub.
    • serverul apeleaza self.publish („method.uri”, rezultat) pentru a impinge informatiile inapoi catre client

Nu acceptam introspectia sau strangerea de mana initiala despre metodele acceptate – clientul si serverul trebuie sa fie sincronizate.

Formatul mesajului:

{const request = {wslink: 1.0, id: `rpc: $ {clientId}: $ {count}`, metoda: ‘myapp.render.window.image’, args: [], kwargs: {w: 512, h : 512}}; const response = {wslink: 1.0, id: `rpc: $ {clientId}: $ {count}`, rezultat: {}, // rezultat sau eroare, nu ambele eroare: {}}; // tipuri utilizate ca prefix pentru id. const types = [‘rpc’, ‘publish’, ‘system’]; }
# adaugati un atasament binar def getImage (self): return {“size”: [512, 512], “blob”: session.addAttachment (memoryview (dataArray)), “mtime”: dataArray.getMTime ()}

Atasamente binare

session.addAttachment () preia date binare si le stocheaza, returnand o cheie de sir care va fi asociata cu atasamentul. Cand este trimis un mesaj care utilizeaza cheia atasament, un mesaj antet text si un mesaj binar sunt trimise in prealabil cu fiecare atasament. Clientul va inlocui apoi bufferul binar cu cheia sirului cand primeste mesajul final.

Abonati-va

Clientul urmareste abonamentele – in prezent serverul trimite orbeste mesaje pentru orice date pe care le produce la care ar putea fi abonat. Acest lucru nu este foarte eficient – daca clientul notifica serverului un abonament, acesta poate trimite datele numai atunci cand cineva asculta. Aplicatia ParaViewWeb Visualizer efectueaza un apel RPC dupa abonare pentru a spune serverului sa inceapa publicarea.

Strangere de mana

Cand clientul se conecteaza initial, acesta trimite un „salut” pentru autentificare cu serverul, astfel incat serverul stie ca acest client poate gestiona mesajele pe care le trimite, iar serverul poate oferi clientului un ID de client unic – pe care clientul trebuie sa il incorporeze campul rpc „id” al mesajelor sale catre server.

  • Primul mesaj trimis de client ar trebui sa fie salut, cu cheia secreta furnizata de lansator.
  • Serverul autentifica cheia si raspunde cu ID-ul clientului.
  • Daca clientul trimite o cheie gresita sau nu exista cheie, serverul raspunde cu un mesaj de eroare de autentificare.

Proiecta

Discutii mai ample in documentul de proiectare.