diff --git a/go/server.go b/go/server.go index b8cd244..424d27b 100644 --- a/go/server.go +++ b/go/server.go @@ -5,6 +5,7 @@ import ( "flag" "log" "net/http" + "sync" "time" "github.com/gorilla/websocket" @@ -15,17 +16,18 @@ var upgrader = websocket.Upgrader{ WriteBufferSize: 2048, } var img = GetImage(10, 10) -var tmpImage = GetImage(img.width, img.height) -func write(ticker time.Ticker, c websocket.Conn) { +func write(ticker time.Ticker, c *websocket.Conn, wg *sync.WaitGroup) { + defer wg.Done() + var tmpImage = GetImage(img.width, img.height) for range ticker.C { diff := tmpImage.GetDiff(&img) for i := 0; i < int(diff.Width*diff.Height); i++ { pix := diff.Pixels[i] if pix.UserID != 0 { - x := i / int(diff.Width) - y := i % int(diff.Height) - msg := Message{X: uint16(x), Y: uint16(y), Timestamp: pix.Timestamp, UserID: pix.UserID, Color: pix.Color} + x := uint16(i / int(diff.Width)) + y := uint16(i % int(diff.Height)) + msg := Message{X: x, Y: y, Timestamp: pix.Timestamp, UserID: pix.UserID, Color: pix.Color} marshalMsg, err := json.Marshal(msg) if err != nil { log.Println("error while writing image", err) @@ -38,15 +40,8 @@ func write(ticker time.Ticker, c websocket.Conn) { } } -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 write(*ticker, *c) +func read(c *websocket.Conn, wg *sync.WaitGroup) { + defer wg.Done() for { _, msg, err := c.ReadMessage() if err != nil { @@ -58,7 +53,23 @@ func serve(w http.ResponseWriter, r *http.Request) { message.JsonToStruct(msg) img.SetPixel(message) } +} +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) + var wg sync.WaitGroup + + // end fucntion if either of the 2 functions is done + wg.Add(1) + go write(*ticker, c, &wg) + go read(c, &wg) + wg.Wait() } func main() { diff --git a/python/clients.py b/python/clients.py index cb938db..4e6c543 100644 --- a/python/clients.py +++ b/python/clients.py @@ -19,10 +19,9 @@ class pixel: timestamp: int userid: int - -async def main(): +async def sender(): async with websockets.connect("ws://localhost:8080/") as websocket: - for _ in range(10): + while True: message = pixel( x=random.randint(0, 9), y=random.randint(0, 9), @@ -30,12 +29,21 @@ async def main(): timestamp=int(time.time()), userid=1, ) - print(message) await websocket.send(json.dumps(message.__dict__)) - while True: - x = await websocket.recv() - print(x) + await asyncio.sleep(0.1) +async def client(): + async with websockets.connect("ws://localhost:8080/") as websocket: + i= 0 + while True: + i+=1 + x = await websocket.recv() + print(i, pixel(**json.loads(x))) + +async def main(): + coros = [sender() for _ in range(100)] + coros.append(client()) + returns = await asyncio.gather(*coros) if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main())