From 124aa461dad2c6953d4efb4e487eea32dc65b741 Mon Sep 17 00:00:00 2001 From: Askill Date: Sat, 28 May 2022 00:30:15 +0200 Subject: [PATCH] useing go routines for read and write in same end point --- go/server.go | 59 ++++++++++++++++++----------------------------- go/util.go | 2 +- python/clients.py | 28 +++++++++++++--------- 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/go/server.go b/go/server.go index 538cb66..0e4c782 100644 --- a/go/server.go +++ b/go/server.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "flag" + "fmt" "log" "net/http" "time" @@ -14,17 +15,33 @@ var upgrader = websocket.Upgrader{ ReadBufferSize: 2048, WriteBufferSize: 2048, } -var img = GetImage(1000, 1000) +var img = GetImage(10, 10) +var tmpImage = GetImage(img.width, img.height) -func set(w http.ResponseWriter, r *http.Request) { +func serve(w http.ResponseWriter, r *http.Request) { c, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("error while upgrading", err) return } defer c.Close() + ticker := time.NewTicker(1 * time.Second) + go func() { + for range ticker.C { + diff := tmpImage.GetDiff(&img) + msg, err := json.Marshal(diff) + fmt.Println(diff) + // TODO only write chenaged pixels to channel instead of entire image + err = c.WriteMessage(1, msg) + if err != nil { + log.Println("error while writing image", err) + break + } + copy(img.pixels, tmpImage.pixels) + } + }() for { - mt, msg, err := c.ReadMessage() + _, msg, err := c.ReadMessage() if err != nil { log.Println("read:", err) break @@ -33,39 +50,8 @@ func set(w http.ResponseWriter, r *http.Request) { message := Message{} message.JsonToStruct(msg) img.SetPixel(message) + } - err = c.WriteMessage(mt, msg) - if err != nil { - log.Println("write:", err) - break - } - } -} - -func get(w http.ResponseWriter, r *http.Request) { - c, err := upgrader.Upgrade(w, r, nil) - if err != nil { - log.Print("error while upgrading", err) - return - } - defer c.Close() - log.Println("Client Connected") - ticker := time.NewTicker(1 * time.Second) - go func() { - for range ticker.C { - tmpImage := GetImage(img.width, img.height) - diff := tmpImage.GetDiff(&img) - msg, err := json.Marshal(diff) - err = c.WriteMessage(1, msg) - if err != nil { - log.Println("error while writing image", err) - } - copy(tmpImage.pixels, img.pixels) - } - }() - if err != nil { - log.Println(err) - } } func main() { @@ -73,7 +59,6 @@ func main() { flag.Parse() log.SetFlags(0) - http.HandleFunc("/set", set) - http.HandleFunc("/get", get) + http.HandleFunc("/", serve) log.Fatal(http.ListenAndServe(*addr, nil)) } diff --git a/go/util.go b/go/util.go index 5085505..cc44dc3 100644 --- a/go/util.go +++ b/go/util.go @@ -90,7 +90,7 @@ func comparePixels(pixel1 *pixel, pixel2 *pixel) bool { func (img *image) GetDiff(img2 *image) messageImage { diff := GetMessageImage(img.width, img.height) for i := 0; i < int(img.width*img.height); i++ { - if comparePixels(&img.pixels[i], &img2.pixels[i]) { + if !comparePixels(&img.pixels[i], &img2.pixels[i]) { diff.Pixels[i].Color = img2.pixels[i].Color diff.Pixels[i].UserID = img2.pixels[i].UserID diff.Pixels[i].Timestamp = img2.pixels[i].Timestamp diff --git a/python/clients.py b/python/clients.py index 53437c4..d9eb6c9 100644 --- a/python/clients.py +++ b/python/clients.py @@ -5,6 +5,7 @@ from dataclasses import dataclass import datetime import json +import random import time import websockets @@ -20,17 +21,22 @@ class pixel: async def main(): - message = pixel( - x=11, - y=0, - color=15, - timestamp=int(time.time()), - userid=1, - ) - async with websockets.connect("ws://localhost:8080/set") as websocket: - print(message) - await websocket.send(json.dumps(message.__dict__)) - await websocket.recv() + + async with websockets.connect("ws://localhost:8080/") as websocket: + for i in range(10): + message = pixel( + x=random.randint(0, 10), + y=random.randint(0, 10), + color=random.randint(0,15), + timestamp=int(time.time()), + userid=1, + ) + print(message) + await websocket.send(json.dumps(message.__dict__)) + print(await websocket.recv()) + while True: + x = await websocket.recv() + print(x) if __name__ == "__main__":