github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/cmd/fastcache1e6/prod_ws.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "github.com/gobwas/ws" 6 "io" 7 "net" 8 ) 9 10 func ProdWS() { 11 addr := fmt.Sprintf("127.0.0.1:%d", *flagPort) 12 l, err := net.Listen("tcp", addr) 13 if err != nil { 14 _ = fmt.Errorf("Io2WS failed to serve: %v\n", err) 15 return 16 } 17 fmt.Printf("Io2WS server is listening on %s\n", addr) 18 for { 19 conn, err := l.Accept() 20 if err != nil { 21 _ = fmt.Errorf("Io2WS failed to serve: %v\n", err) 22 continue 23 } 24 _, err = ws.Upgrade(conn) 25 if err != nil { 26 continue 27 } 28 29 go func(conn net.Conn) { 30 defer conn.Close() 31 32 for { 33 header, err := ws.ReadHeader(conn) 34 if err != nil { 35 _ = fmt.Errorf("Io2WS failed to ReadHeader: %v\n", err) 36 return 37 } 38 if header.OpCode == ws.OpClose { 39 _ = fmt.Errorf("Io2WS client to Close: %v\n", err) 40 return 41 } 42 43 payload := make([]byte, header.Length) 44 _, err = io.ReadFull(conn, payload) 45 if err != nil { 46 _ = fmt.Errorf("Io2WS failed to serve: %v\n", err) 47 continue 48 } 49 50 if header.Masked { 51 ws.Cipher(payload, header.Mask, 0) 52 } 53 54 // Reset the Masked flag, server frames must not be masked as RFC6455 says. 55 header.Masked = false 56 if err = ws.WriteHeader(conn, header); err != nil { 57 _ = fmt.Errorf("Io2WS failed to WriteHeader: %v\n", err) 58 return 59 } 60 61 result := defaultService.Handle(payload) 62 if _, err := conn.Write(result); err != nil { 63 _ = fmt.Errorf("Io2WS failed to Write: %v\n", err) 64 } 65 } 66 }(conn) 67 } 68 }