/
chat.go
129 lines (115 loc) · 2.88 KB
/
chat.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main
import (
"encoding/json"
"flag"
"fmt"
"net/http"
"github.com/google/uuid"
)
type Hub struct {
// Registered clients.
clients map[*Client]bool
// Inbound messages from the clients.
broadcast chan []byte
// Register requests from the clients.
register chan *Client
// Unregister requests from clients.
unregister chan *Client
}
func newHub() *Hub {
return &Hub{
broadcast: make(chan []byte),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
}
}
type Message struct {
Id string `json:"id"`
Message string `json:"message"`
Name string `json:"name"`
}
func (h *Hub) run() {
for {
select {
case client := <-h.register:
h.clients[client] = true
case client := <-h.unregister:
if _, ok := h.clients[client]; ok {
delete(h.clients, client)
close(client.send)
}
case message := <-h.broadcast:
var msgParsed Message
err := json.Unmarshal(message, &msgParsed)
if err != nil {
panic(err)
}
for client := range h.clients {
if client.id == msgParsed.Id {
continue
}
select {
case client.send <- message:
default:
close(client.send)
delete(h.clients, client)
}
}
}
}
}
func main() {
port := flag.String("port", "80", "port to listen")
flag.Parse()
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
hub := newHub()
go hub.run()
/*http.HandleFunc("/client", func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/client" {
w.Header().Set("Content-Type", "text/html")
fmt.Fprintf(w, `<input id="input" type="text" />
<button onclick="send()">Send</button>
<pre id="output"></pre>
<script>
var input = document.getElementById("input");
var output = document.getElementById("output");
var socket = new WebSocket("ws://localhost:80/echo");
socket.onopen = function () {
output.innerHTML += "Status: Connected\n";
};
socket.onmessage = function (e) {
output.innerHTML += "Server: " + e.data + "\n";
};
function send() {
socket.send(input.value);
input.value = "";
}
</script>`)
} else {
http.Error(w, "404", http.StatusNotFound)
}
})*/
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("NEW CONNECTION")
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println(err)
return
}
_, msg, err := conn.ReadMessage()
// conn.RemoteAddr()
if err != nil {
fmt.Println(err)
return
}
name := string(msg)
clid := uuid.New().String()
fmt.Println("new client: ", name, clid)
serveWs(conn, hub, w, r, name, clid)
})
fmt.Println("starting vchat service on port:", *port)
if err := http.ListenAndServe(":"+*port, nil); err != nil {
fmt.Println(err)
}
}