no more timeouts

This commit is contained in:
Askill 2022-05-31 16:15:09 +02:00
parent dd4414ff0d
commit 2293f52d9f
3 changed files with 50 additions and 14 deletions

View File

@ -5,6 +5,7 @@ import (
"flag" "flag"
"log" "log"
"net/http" "net/http"
"strconv"
"time" "time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@ -14,7 +15,22 @@ var upgrader = websocket.Upgrader{
ReadBufferSize: 2048, ReadBufferSize: 2048,
WriteBufferSize: 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) { func get(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil) 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) log.Print("error while upgrading", err)
return return
} }
c.SetReadLimit(maxMessageSize)
c.SetPongHandler(func(string) error { c.SetReadDeadline(time.Now().Add(pongWait)); return nil })
defer c.Close() defer c.Close()
ticker := time.NewTicker(1 * time.Second) ticker := time.NewTicker(1 * time.Second)
@ -43,8 +63,13 @@ func get(w http.ResponseWriter, r *http.Request) {
break break
} }
err = c.WriteMessage(1, marshalMsg) err = c.WriteMessage(1, marshalMsg)
_, msg2, _ := c.ReadMessage()
_ = msg2
} }
} }
if err := c.WriteMessage(websocket.PingMessage, []byte{}); err != nil {
return
}
copy(tmpImage.pixels, refImage.pixels) copy(tmpImage.pixels, refImage.pixels)
} }
} }
@ -55,18 +80,25 @@ func set(w http.ResponseWriter, r *http.Request) {
log.Print("error while upgrading", err) log.Print("error while upgrading", err)
return return
} }
c.SetReadLimit(maxMessageSize)
c.SetPongHandler(func(string) error { c.SetReadDeadline(time.Now().Add(pongWait)); return nil })
defer c.Close() defer c.Close()
for { for {
_, msg, err := c.ReadMessage() mt, msg, err := c.ReadMessage()
if err != nil { if err != nil {
log.Println("read:", err) log.Println("read:", err)
break break
} }
if mt == websocket.PingMessage {
continue
}
message := Message{} message := Message{}
json.Unmarshal(msg, &message) json.Unmarshal(msg, &message)
img.SetPixel(message) status := img.SetPixel(message)
err = c.WriteMessage(1, []byte(strconv.Itoa(status)))
} }
} }

View File

@ -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 { 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) fmt.Printf("User %d tried accessing out of bounds \n", message.UserID)
return img return 1
} }
if message.Color >= 16 || message.Color < 0 { if message.Color >= 16 || message.Color < 0 {
fmt.Printf("User %d tried setting non existent color \n", message.UserID) 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) pos := uint32(message.X)*uint32(img.width) + uint32(message.Y)
img.pixels[pos].setColor(message.Color, message.Timestamp, message.UserID) img.pixels[pos].setColor(message.Color, message.Timestamp, message.UserID)
return img return 0
} }
func comparePixels(pixel1 *pixelContainer, pixel2 *pixelContainer) bool { func comparePixels(pixel1 *pixelContainer, pixel2 *pixelContainer) bool {

View File

@ -26,18 +26,21 @@ async def sender():
async with websockets.connect("ws://localhost:8080/set") as websocket: async with websockets.connect("ws://localhost:8080/set") as websocket:
while True: while True:
message = pixel( message = pixel(
x=random.randint(0, 99), x=random.randint(0, 999),
y=random.randint(0, 99), y=random.randint(0, 999),
color=random.randint(0,11), color=random.randint(0,15),
timestamp=int(time.time()), timestamp=int(time.time()),
userid=1, userid=1,
) )
await websocket.send(json.dumps(message.__dict__)) await websocket.send(json.dumps(message.__dict__))
succ = await websocket.recv()
if succ == "1":
print(message, "was not set")
await asyncio.sleep(0.1) await asyncio.sleep(0.1)
async def client(): async def client():
image = np.zeros(shape=[100, 100, 3], dtype=np.uint8) image = np.zeros(shape=[1000, 1000, 3], dtype=np.uint8)
colors = [] colors = []
for name, hex in matplotlib.colors.cnames.items(): for name, hex in matplotlib.colors.cnames.items():
colors.append(matplotlib.colors.to_rgb(hex)) colors.append(matplotlib.colors.to_rgb(hex))
@ -48,10 +51,11 @@ async def client():
i+=1 i+=1
x = pixel(**json.loads(await websocket.recv())) x = pixel(**json.loads(await websocket.recv()))
image[x.x][x.y] = ([y*255 for y in colors[x.color]]) 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.imshow("changes x", image)
cv2.waitKey(10) & 0XFF cv2.waitKey(10) & 0XFF
print(i, x) await websocket.send("1")
#print(i, x)
async def main(): async def main():
coros = [sender() for _ in range(100)] coros = [sender() for _ in range(100)]