golang is a simple chat room program based on websocket
- 2020-06-01 09:58:54
- OfStack
This article illustrates a simple chat room based on the golang websocket implementation. I will share it with you for your reference as follows:
First of all, I was busy with my work and didn't update my blog recently. Today I will take a break to study golang websocket, which is quite interesting. I wrote a chat room to share with you.
websocket package: code. google. com/p/go net/websocket
Documents: http: / / go. pkgdoc. org/code google. com/p/go net/websocket
First, install the websocket package
go get code.google.com/p/go.net/websocket
Down is the chat room code, ha ha
golang websocket chat room
package main
import (
"fmt"
"io"
"bufio"
"net/http"
"code.google.com/p/go.net/websocket"
"container/list"
)
var connid int
var conns *list.List
func ChatroomServer(ws *websocket.Conn) {
defer ws.Close()
connid++
id := connid
fmt.Printf("connection id: %d\n", id)
item := conns.PushBack(ws)
defer conns.Remove(item)
name := fmt.Sprintf("user%d", id)
SendMessage(nil, fmt.Sprintf("welcome %s join\n", name))
r := bufio.NewReader(ws)
for {
data, err := r.ReadBytes('\n')
if err != nil {
fmt.Printf("disconnected id: %d\n", id)
SendMessage(item, fmt.Sprintf("%s offline\n", name))
break
}
fmt.Printf("%s: %s", name, data)
SendMessage(item, fmt.Sprintf("%s\t> %s", name, data))
}
}
func SendMessage(self *list.Element, data string) {
// for _, item := range conns {
for item := conns.Front(); item != nil; item = item.Next() {
ws, ok := item.Value.(*websocket.Conn)
if !ok {
panic("item not *websocket.Conn")
}
if item == self {
continue
}
io.WriteString(ws, data)
}
}
// Web client
func Client(w http.ResponseWriter, r *http.Request) {
html := `<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>golang websocket chatroom</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
var ws = new WebSocket("ws://127.0.0.1:6611/chatroom");
ws.onopen = function(e){
console.log("onopen");
console.dir(e);
};
ws.onmessage = function(e){
console.log("onmessage");
console.dir(e);
$('#log').append('<p>'+e.data+'<p>');
$('#log').get(0).scrollTop = $('#log').get(0).scrollHeight;
};
ws.onclose = function(e){
console.log("onclose");
console.dir(e);
};
ws.onerror = function(e){
console.log("onerror");
console.dir(e);
};
$(function(){
$('#msgform').submit(function(){
ws.send($('#msg').val()+"\n");
$('#log').append('<p style="color:red;">My > '+$('#msg').val()+'<p>');
$('#log').get(0).scrollTop = $('#log').get(0).scrollHeight;
$('#msg').val('');
return false;
});
});
</script>
</head>
<body>
<div id="log" style="height: 300px;overflow-y: scroll;border: 1px solid #CCC;">
</div>
<div>
<form id="msgform">
<input type="text" id="msg" size="60" />
</form>
</div>
</body>
</html>`
io.WriteString(w, html)
}
func main() {
fmt.Printf(`Welcome chatroom server!
author: dotcoo zhao
url: http://www.dotcoo.com/golang-websocket-chatroom
`)
connid = 0
conns = list.New()
http.Handle("/chatroom", websocket.Handler(ChatroomServer));
http.HandleFunc("/", Client);
err := http.ListenAndServe(":6611", nil);
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}
It's a little more basic, but it has all the basic functions.
golang websocket client
package main
import (
"fmt"
"bufio"
"io"
"os"
"code.google.com/p/go.net/websocket"
)
func Command(ws *websocket.Conn) {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(ws)
for {
data, err := r.ReadBytes('\n')
if err != nil {
panic(err)
}
_, err = w.Write(data)
if err != nil {
panic(err)
}
w.Flush()
fmt.Printf("My\t> ")
}
}
func main() {
fmt.Printf(`Welcome chatroom!
author: dotcoo zhao
url: http://www.dotcoo.com/golang-websocket-chatroom
`)
origin := "http://127.0.0.1:6611/"
url := "ws://127.0.0.1:6611/chatroom"
ws, err := websocket.Dial(url, "", origin)
if err != nil {
panic(err)
}
defer ws.Close()
r := bufio.NewReader(ws)
//w := bufio.NewWriter(os.Stdout)
go Command(ws)
for {
data, err := r.ReadBytes('\n')
if err == io.EOF {
fmt.Printf("disconnected\n")
os.Exit(0)
}
if err != nil {
panic(err)
}
fmt.Printf("\r%sMy\t> ", data)
}
}
I hope this article has been helpful to you in the programming of Go language.