1
1
package main
2
2
3
3
import (
4
- "fmt"
4
+ // "fmt"
5
5
"net/http"
6
+ "time"
7
+
6
8
"github.com/gorilla/websocket"
7
9
)
8
10
9
- type JsonData struct {
10
- Text string `json:"text"`
11
- Client string `json:"client"`
12
- Timestamp string `json:"timestamp"`
13
- }
11
+ const (
12
+ // Time allowed to write a message to the peer.
13
+ writeWait = 10 * time .Second
14
+ // Time allowed to read the next pong message from the peer.
15
+ pongWait = 60 * time .Second
16
+ // Send pings to peer with this period. Must be less than pongWait.
17
+ pingPeriod = (pongWait * 9 ) / 10
18
+ // Maximum message size allowed from peer.
19
+ maxMessageSize = 512
20
+ )
14
21
15
22
var upgrader = websocket.Upgrader {
16
23
ReadBufferSize : 1024 ,
@@ -19,32 +26,105 @@ var upgrader = websocket.Upgrader{
19
26
CheckOrigin : func (r * http.Request ) bool { return true },
20
27
}
21
28
22
- // handle /ws route, upgrade HTTP request and forward ws conn to worker
23
- func wsHandler (w http.ResponseWriter , r * http.Request ) {
24
- conn , err := upgrader .Upgrade (w , r , nil )
25
- if err != nil {
26
- http .Error (w , "Could not open websocket connection" , http .StatusBadRequest )
27
- }
29
+ type JsonData struct {
30
+ Text string `json:"text"`
31
+ Client string `json:"client"`
32
+ Timestamp string `json:"timestamp"`
33
+ }
28
34
29
- go handleConnection (conn )
35
+ type Client struct {
36
+ hub * ConnHub
37
+ conn * websocket.Conn
38
+ send chan []byte
30
39
}
31
40
32
- func handleConnection (conn * websocket.Conn ) {
33
- fmt .Println ("Handling new connection" )
41
+ func (c * Client ) readPump () {
42
+ // schedule client to be disconnected
43
+ defer func () {
44
+ c .hub .unregister <- c
45
+ c .conn .Close ()
46
+ }()
34
47
48
+ // init client connection
49
+ c .conn .SetReadLimit (maxMessageSize )
50
+ c .conn .SetReadDeadline (time .Now ().Add (pongWait ))
51
+ c .conn .SetPongHandler (func (string ) error {
52
+ c .conn .SetReadDeadline (time .Now ().Add (pongWait ))
53
+ return nil
54
+ })
55
+
56
+ // handle connection read
35
57
for {
36
- fmt .Println ("Awaiting data from connection..." )
58
+ // read JSON data from connection
59
+ // message := JsonData{}
60
+ // if err := c.conn.ReadJSON(&message); err != nil {
61
+ // fmt.Println("Error reading JSON", err)
62
+ // }
63
+ // fmt.Printf("Get response: %#v\n", message)
37
64
38
- res := JsonData {}
65
+ // // queue message for writing
66
+ // c.hub.broadcast <- message
67
+ }
68
+ }
39
69
40
- if err := conn .ReadJSON (& res ); err != nil {
41
- fmt .Println ("Error reading JSON" , err )
42
- }
70
+ func (c * Client ) writePump () {
71
+ ticker := time .NewTicker (pingPeriod )
72
+ defer func () {
73
+ ticker .Stop ()
74
+ c .conn .Close ()
75
+ }()
43
76
44
- fmt .Printf ("Get response: %#v\n " , res )
77
+ for {
78
+ select {
79
+ case message , ok := <- c .send :
80
+ c .conn .SetWriteDeadline (time .Now ().Add (writeWait ))
81
+ if ! ok {
82
+ // channel has been closed by the hub
83
+ c .conn .WriteMessage (websocket .CloseMessage , []byte {})
84
+ return
85
+ }
86
+
87
+ w , err := c .conn .NextWriter (websocket .TextMessage )
88
+ if err != nil {
89
+ return
90
+ }
91
+ w .Write (message )
45
92
46
- if err := conn .WriteJSON (res ); err != nil {
47
- fmt .Println ("Error writing JSON" , err )
93
+ // coalesce pending messages into one message
94
+ n := len (c .send )
95
+ for i := 0 ; i < n ; i ++ {
96
+ w .Write (<- c .send )
97
+ }
98
+
99
+ if err := w .Close (); err != nil {
100
+ return
101
+ }
102
+ // send ping over websocket
103
+ case <- ticker .C :
104
+ c .conn .SetWriteDeadline (time .Now ().Add (writeWait ))
105
+ if err := c .conn .WriteMessage (websocket .PingMessage , []byte {}); err != nil {
106
+ return
107
+ }
48
108
}
49
109
}
50
110
}
111
+
112
+ // handle /ws route, upgrade HTTP request and begin handling of client conn
113
+ func wsHandler (hub * ConnHub , w http.ResponseWriter , r * http.Request ) {
114
+ conn , err := upgrader .Upgrade (w , r , nil )
115
+ if err != nil {
116
+ http .Error (w , "Could not open websocket connection" , http .StatusBadRequest )
117
+ }
118
+
119
+ // init new client, register to hub
120
+ client := & Client {
121
+ hub : hub ,
122
+ conn : conn ,
123
+ send : make (chan []byte , 256 ),
124
+ }
125
+ client .hub .register <- client
126
+
127
+ // separate reads and writes to conform to WebSocket standard of one concurrent reader and writer
128
+ // go client.writePump()
129
+ // go client.readPump()
130
+ }
0 commit comments