Skip to content

Commit 7b8c4af

Browse files
committed
Support for displaying connected clients
1 parent dc88810 commit 7b8c4af

File tree

3 files changed

+61
-45
lines changed

3 files changed

+61
-45
lines changed

app/src/App.js

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,7 @@ import React, { Component } from 'react';
33
import Message from './components/Message';
44
import './App.css';
55

6-
const socket = new WebSocket("ws://127.0.0.1:8081/ws");
7-
socket.onopen = (event) => {
8-
console.log('Opened socket');
9-
console.log(event);
10-
};
11-
12-
socket.onerror = (event) => {
13-
console.log(event);
14-
}
6+
let socket = null;
157

168
class App extends Component {
179
constructor(props) {
@@ -30,18 +22,24 @@ class App extends Component {
3022
participantSubmit(e) {
3123
e.preventDefault();
3224
const input = document.getElementById("participant-form").value;
33-
console.log(input);
3425
if (input === "") {
3526
return;
3627
}
37-
38-
this.setState({
39-
init: false,
40-
participants: [
41-
...this.state.participants,
42-
input,
43-
]
44-
});
28+
socket = new WebSocket(`ws://127.0.0.1:8081/ws?name=${input}`);
29+
socket.onopen = (event) => {
30+
console.log('Opened socket');
31+
console.log(event);
32+
};
33+
socket.onerror = (event) => {
34+
console.log(event);
35+
}
36+
socket.onmessage = (event) => {
37+
const names = JSON.parse(event.data);
38+
this.setState({
39+
init: false,
40+
participants: names,
41+
});
42+
}
4543
}
4644

4745
textSubmit(e) {
@@ -68,19 +66,21 @@ class App extends Component {
6866
}
6967

7068
componentDidMount() {
71-
socket.onmessage = (event) => {
72-
const { text, client, timestamp } = JSON.parse(event.data);
73-
74-
this.setState({
75-
messages: [
76-
...this.state.messages,
77-
{
78-
text,
79-
client,
80-
timestamp,
81-
}
82-
],
83-
});
69+
if (!this.state.init) {
70+
socket.onmessage = (event) => {
71+
const { text, client, timestamp } = JSON.parse(event.data);
72+
73+
this.setState({
74+
messages: [
75+
...this.state.messages,
76+
{
77+
text,
78+
client,
79+
timestamp,
80+
}
81+
],
82+
});
83+
}
8484
}
8585
}
8686

server/conn_hub.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package main
22

33
type ConnHub struct {
4-
clients map[*Client]bool
4+
clients map[*Client]string
55
broadcast chan []byte
66
register chan *Client
77
unregister chan *Client
@@ -10,7 +10,7 @@ type ConnHub struct {
1010
// init ConnHub
1111
func newConnHub() *ConnHub {
1212
return &ConnHub{
13-
clients: make(map[*Client]bool),
13+
clients: make(map[*Client]string),
1414
broadcast: make(chan []byte),
1515
register: make(chan *Client),
1616
unregister: make(chan *Client),
@@ -23,7 +23,7 @@ func (hub *ConnHub) run() {
2323
select {
2424
// register client to hub
2525
case client := <-hub.register:
26-
hub.clients[client] = true
26+
hub.clients[client] = client.name
2727
// unregister client to hub
2828
case client := <-hub.unregister:
2929
if _, ok := hub.clients[client]; ok {

server/websocket.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package main
22

33
import (
4-
// "fmt"
4+
"fmt"
55
"net/http"
66
"time"
7+
"encoding/json"
78

89
"github.com/gorilla/websocket"
910
)
@@ -27,12 +28,14 @@ var upgrader = websocket.Upgrader{
2728
}
2829

2930
type JsonData struct {
31+
Name string `json:"name"`
3032
Text string `json:"text"`
3133
Client string `json:"client"`
3234
Timestamp string `json:"timestamp"`
3335
}
3436

3537
type Client struct {
38+
name string
3639
hub *ConnHub
3740
conn *websocket.Conn
3841
send chan []byte
@@ -56,14 +59,15 @@ func (c *Client) readPump() {
5659
// handle connection read
5760
for {
5861
// 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)
64-
65-
// // queue message for writing
66-
// c.hub.broadcast <- message
62+
message := JsonData{}
63+
if err := c.conn.ReadJSON(&message); err != nil {
64+
fmt.Println("Error reading JSON", err)
65+
}
66+
fmt.Printf("Get response: %#v\n", message)
67+
68+
messageJson, _ := json.Marshal(message)
69+
// queue message for writing
70+
c.hub.broadcast <- messageJson
6771
}
6872
}
6973

@@ -117,14 +121,26 @@ func wsHandler(hub *ConnHub, w http.ResponseWriter, r *http.Request) {
117121
}
118122

119123
// init new client, register to hub
124+
name := r.URL.Query().Get("name")
120125
client := &Client{
126+
name: name, // sent in http query params
121127
hub: hub,
122128
conn: conn,
123129
send: make(chan []byte, 256),
124130
}
125131
client.hub.register <- client
126132

133+
// construct JSON list of connected client names and send to new client for display
134+
names := make([]string, len(client.hub.clients) + 1)
135+
i := 0
136+
for k := range client.hub.clients {
137+
names[i] = client.hub.clients[k]
138+
i++
139+
}
140+
names[i] = name
141+
client.conn.WriteJSON(names)
142+
127143
// separate reads and writes to conform to WebSocket standard of one concurrent reader and writer
128-
// go client.writePump()
129-
// go client.readPump()
144+
go client.writePump()
145+
go client.readPump()
130146
}

0 commit comments

Comments
 (0)