golang基于websocket实现的简易聊天室程序
发布时间:2020-12-16 19:30:51 所属栏目:大数据 来源:网络整理
导读:本篇章节讲解golang基于websocket实现的简易聊天室。供大家参考研究具体如下: 先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家. websocket包 : code.google.com/p/go.net/w
本篇章节讲解golang基于websocket实现的简易聊天室。分享给大家供大家参考,具体如下: 先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家. websocket包 : code.google.com/p/go.net/websocket 文档 : http://go.pkgdoc.org/code.google.com/p/go.net/websocket 首先安装websocket包 复制代码 代码如下: go get code.google.com/p/go.net/websocket
下来就是聊天室代码了,呵呵 golang websocket 聊天室 复制代码 代码如下: 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: %dn",id) item := conns.PushBack(ws) defer conns.Remove(item) name := fmt.Sprintf("user%d",id) SendMessage(nil,fmt.Sprintf("welcome %s joinn",name)) r := bufio.NewReader(ws) for { data,err := r.ReadBytes('n') if err != nil { fmt.Printf("disconnected id: %dn",id) SendMessage(item,fmt.Sprintf("%s offlinen",name)) break } fmt.Printf("%s: %s",name,data) SendMessage(item,fmt.Sprintf("%st> %s",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="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()) } } 简陋了些,但是基本功能都有了. golang websocket 客户端 复制代码 代码如下: 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("Myt> ") } } 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("disconnectedn") os.Exit(0) } if err != nil { panic(err) } fmt.Printf("r%sMyt> ",data) } } 希望本文所述对大家Go语言程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |