源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-06-30 15:52 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:golang基于websocket实现的简易聊天室程序
本文实例讲述了golang基于websocket实现的简易聊天室。分享给大家供大家参考,具体如下: 先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家. websocket包 : code.google.com/p/go.net/websocket 文档 : http://go.pkgdoc.org/code.google.com/p/go.net/websocket 首先安装websocket包
[u]复制代码[/u] 代码如下:
go get code.google.com/p/go.net/websocket
下来就是聊天室代码了,呵呵 golang websocket 聊天室
[u]复制代码[/u] 代码如下:
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)     } } // 网页客户端 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 客户端
[u]复制代码[/u] 代码如下:
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)     } }
希望本文所述对大家Go语言程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部