golang基于websocket实现的简易聊天室程序
本文实例讲述了golang基于websocket实现的简易聊天室。分享给大家供大家参考,具体如下:
先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golangwebsocket研究了一下,挺好玩的,写了一个聊天室,分享给大家.
websocket包:code.google.com/p/go.net/websocket
文档:http://go.pkgdoc.org/code.google.com/p/go.net/websocket
首先安装websocket包
gogetcode.google.com/p/go.net/websocket
下来就是聊天室代码了,呵呵
golangwebsocket聊天室
packagemain
import(
   "fmt"
   "io"
   "bufio"
   "net/http"
   "code.google.com/p/go.net/websocket"
   "container/list"
)
varconnidint
varconns*list.List
funcChatroomServer(ws*websocket.Conn){
   deferws.Close()
   connid++
   id:=connid
   fmt.Printf("connectionid:%d\n",id)
   item:=conns.PushBack(ws)
   deferconns.Remove(item)
   name:=fmt.Sprintf("user%d",id)
   SendMessage(nil,fmt.Sprintf("welcome%sjoin\n",name))
   r:=bufio.NewReader(ws)
   for{
       data,err:=r.ReadBytes('\n')
       iferr!=nil{
           fmt.Printf("disconnectedid:%d\n",id)
           SendMessage(item,fmt.Sprintf("%soffline\n",name))
           break
       }
       fmt.Printf("%s:%s",name,data)
       SendMessage(item,fmt.Sprintf("%s\t>%s",name,data))
   }
}
funcSendMessage(self*list.Element,datastring){
   //for_,item:=rangeconns{
   foritem:=conns.Front();item!=nil;item=item.Next(){
       ws,ok:=item.Value.(*websocket.Conn)
       if!ok{
           panic("itemnot*websocket.Conn")
       }
       ifitem==self{
           continue
       }
       io.WriteString(ws,data)
   }
}
//网页客户端
funcClient(whttp.ResponseWriter,r*http.Request){
   html:=`<!doctypehtml>
<html>
<head>
   <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
   <title>golangwebsocketchatroom</title>
   <scriptsrc="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
   <script>
       varws=newWebSocket("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('<pstyle="color:red;">My>'+$('#msg').val()+'<p>');
               $('#log').get(0).scrollTop=$('#log').get(0).scrollHeight;
               $('#msg').val('');
               returnfalse;
           });
       });
   </script>
</head>
<body>
   <divid="log"style="height:300px;overflow-y:scroll;border:1pxsolid#CCC;">
   </div>
   <div>
       <formid="msgform">
           <inputtype="text"id="msg"size="60"/>
       </form>
   </div>
</body>
</html>`
   io.WriteString(w,html)
}
funcmain(){
   fmt.Printf(`Welcomechatroomserver!
author:dotcoozhao
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);
   iferr!=nil{
       panic("ListenAndServe:"+err.Error())
   }
}
简陋了些,但是基本功能都有了.
golangwebsocket客户端
packagemain
import(
   "fmt"
   "bufio"
   "io"
   "os"
   "code.google.com/p/go.net/websocket"
)
funcCommand(ws*websocket.Conn){
   r:=bufio.NewReader(os.Stdin)
   w:=bufio.NewWriter(ws)
   for{
       data,err:=r.ReadBytes('\n')
       iferr!=nil{
           panic(err)
       }
       _,err=w.Write(data)
       iferr!=nil{
           panic(err)
       }
       w.Flush()
       fmt.Printf("My\t>")
   }
}
funcmain(){
   fmt.Printf(`Welcomechatroom!
   author:dotcoozhao
   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)
   iferr!=nil{
       panic(err)
   }
   deferws.Close()
   r:=bufio.NewReader(ws)
   //w:=bufio.NewWriter(os.Stdout)
   goCommand(ws)
   for{
       data,err:=r.ReadBytes('\n')
       iferr==io.EOF{
           fmt.Printf("disconnected\n")
           os.Exit(0)
       }
       iferr!=nil{
           panic(err)
       }
       fmt.Printf("\r%sMy\t>",data)
   }
}
希望本文所述对大家Go语言程序设计有所帮助。
