diff --git a/go/server.go b/go/server.go index 5411778..1c3029d 100644 --- a/go/server.go +++ b/go/server.go @@ -5,6 +5,7 @@ import ( "flag" "log" "net/http" + "strconv" "time" "github.com/gorilla/websocket" @@ -14,7 +15,22 @@ var upgrader = websocket.Upgrader{ ReadBufferSize: 2048, WriteBufferSize: 2048, } -var img = GetImage(100, 100) + +const ( + // Time allowed to write a message to the peer. + writeWait = 10 * time.Second + + // Time allowed to read the next pong message from the peer. + pongWait = 60 * time.Second + + // Send pings to peer with this period. Must be less than pongWait. + pingPeriod = (pongWait * 9) / 10 + + // Maximum message size allowed from peer. + maxMessageSize = 512 +) + +var img = GetImage(1000, 1000) func get(w http.ResponseWriter, r *http.Request) { c, err := upgrader.Upgrade(w, r, nil) @@ -22,6 +38,10 @@ func get(w http.ResponseWriter, r *http.Request) { log.Print("error while upgrading", err) return } + + c.SetReadLimit(maxMessageSize) + c.SetPongHandler(func(string) error { c.SetReadDeadline(time.Now().Add(pongWait)); return nil }) + defer c.Close() ticker := time.NewTicker(1 * time.Second) @@ -43,8 +63,13 @@ func get(w http.ResponseWriter, r *http.Request) { break } err = c.WriteMessage(1, marshalMsg) + _, msg2, _ := c.ReadMessage() + _ = msg2 } } + if err := c.WriteMessage(websocket.PingMessage, []byte{}); err != nil { + return + } copy(tmpImage.pixels, refImage.pixels) } } @@ -55,18 +80,25 @@ func set(w http.ResponseWriter, r *http.Request) { log.Print("error while upgrading", err) return } + c.SetReadLimit(maxMessageSize) + + c.SetPongHandler(func(string) error { c.SetReadDeadline(time.Now().Add(pongWait)); return nil }) + defer c.Close() for { - _, msg, err := c.ReadMessage() + mt, msg, err := c.ReadMessage() if err != nil { log.Println("read:", err) break } - + if mt == websocket.PingMessage { + continue + } message := Message{} json.Unmarshal(msg, &message) - img.SetPixel(message) + status := img.SetPixel(message) + err = c.WriteMessage(1, []byte(strconv.Itoa(status))) } } diff --git a/go/util.go b/go/util.go index fb840db..31e8c7b 100644 --- a/go/util.go +++ b/go/util.go @@ -48,18 +48,18 @@ func (p *pixelContainer) setColor(color uint8, timestamp int64, userid uint64) { } } -func (img *image) SetPixel(message Message) *image { +func (img *image) SetPixel(message Message) int { if message.X >= img.width || message.Y >= img.height || message.X < 0 || message.Y < 0 { fmt.Printf("User %d tried accessing out of bounds \n", message.UserID) - return img + return 1 } if message.Color >= 16 || message.Color < 0 { fmt.Printf("User %d tried setting non existent color \n", message.UserID) - return img + return 1 } pos := uint32(message.X)*uint32(img.width) + uint32(message.Y) img.pixels[pos].setColor(message.Color, message.Timestamp, message.UserID) - return img + return 0 } func comparePixels(pixel1 *pixelContainer, pixel2 *pixelContainer) bool { diff --git a/python/clients.py b/python/clients.py index d00034a..0f6cd7e 100644 --- a/python/clients.py +++ b/python/clients.py @@ -26,18 +26,21 @@ async def sender(): async with websockets.connect("ws://localhost:8080/set") as websocket: while True: message = pixel( - x=random.randint(0, 99), - y=random.randint(0, 99), - color=random.randint(0,11), + x=random.randint(0, 999), + y=random.randint(0, 999), + color=random.randint(0,15), timestamp=int(time.time()), userid=1, ) await websocket.send(json.dumps(message.__dict__)) + succ = await websocket.recv() + if succ == "1": + print(message, "was not set") await asyncio.sleep(0.1) async def client(): - image = np.zeros(shape=[100, 100, 3], dtype=np.uint8) + image = np.zeros(shape=[1000, 1000, 3], dtype=np.uint8) colors = [] for name, hex in matplotlib.colors.cnames.items(): colors.append(matplotlib.colors.to_rgb(hex)) @@ -48,10 +51,11 @@ async def client(): i+=1 x = pixel(**json.loads(await websocket.recv())) image[x.x][x.y] = ([y*255 for y in colors[x.color]]) - if i% 1000 == 0: + if i% 500 == 0: cv2.imshow("changes x", image) cv2.waitKey(10) & 0XFF - print(i, x) + await websocket.send("1") + #print(i, x) async def main(): coros = [sender() for _ in range(100)]