golang基于websocket实现的简易聊天室程序

2018-09-24 21:25

阅读:526

  本文实例讲述了golang基于websocket实现的简易聊天室。分享给大家供大家参考,具体如下:

  先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家.

  websocket包websocket

  文档 :

  首先安装websocket包
复制代码 代码如下:

  下来就是聊天室代码了,呵呵

  golang websocket 聊天室
复制代码 代码如下:package main
import (
fmt
io
bufio
net/http
container/list
)
var connid int
var conns *list.List
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)
}
}
// 网页客户端
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=
<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:
`)
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())
}
}

  简陋了些,但是基本功能都有了.

  golang websocket 客户端
复制代码 代码如下:package main
import (
fmt
bufio
io
os
)
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:
`)
origin :=
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)
}
}

  希望本文所述对大家Go语言程序设计有所帮助。


评论


亲,登录后才可以留言!