• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2010年2月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28123456
            78910111213


            專注即時通訊及網游服務端編程
            ------------------------------------
            Openresty 官方模塊
            Openresty 標準模塊(Opm)
            Openresty 三方模塊
            ------------------------------------
            本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 216814
            • 排名 - 118

            最新評論

            閱讀排行榜

            http://www.cnblogs.com/wangrudong003/p/5535689.html
            go代碼部分:
              1// WebChat project main.go
              2package main
              3
              4import (
              5    "fmt"
              6    "net/http"
              7    "time"
              8
              9    "encoding/json"
             10
             11    "strings"
             12
             13    "golang.org/x/net/websocket"
             14)
             15
             16//全局信息
             17var datas Datas
             18var users map[*websocket.Conn]string
             19
             20func main() {
             21    fmt.Println("啟動時間")
             22    fmt.Println(time.Now())
             23
             24    //初始化
             25    datas = Datas{}
             26    users = make(map[*websocket.Conn]string)
             27
             28    //綁定效果頁面
             29    http.HandleFunc("/", h_index)
             30    //綁定socket方法
             31    http.Handle("/webSocket", websocket.Handler(h_webSocket))
             32    //開始監聽
             33    http.ListenAndServe(":8", nil)
             34}

             35
             36func h_index(w http.ResponseWriter, r *http.Request) {
             37
             38    http.ServeFile(w, r, "index.html")
             39}

             40
             41func h_webSocket(ws *websocket.Conn) {
             42
             43    var userMsg UserMsg
             44    var data string
             45    for {
             46
             47        //判斷是否重復連接
             48        if _, ok := users[ws]; !ok {
             49            users[ws] = "匿名"
             50        }

             51        userMsgsLen := len(datas.UserMsgs)
             52        fmt.Println("UserMsgs", userMsgsLen, "users長度:", len(users))
             53
             54        //有消息時,全部分發送數據
             55        if userMsgsLen > 0 {
             56            b, errMarshl := json.Marshal(datas)
             57            if errMarshl != nil {
             58                fmt.Println("全局消息內容異常")
             59                break
             60            }

             61            for key, _ := range users {
             62                errMarshl = websocket.Message.Send(key, string(b))
             63                if errMarshl != nil {
             64                    //移除出錯的鏈接
             65                    delete(users, key)
             66                    fmt.Println("發送出錯")
             67                    break
             68                }

             69            }

             70            datas.UserMsgs = make([]UserMsg, 0)
             71        }

             72
             73        fmt.Println("開始解析數據")
             74        err := websocket.Message.Receive(ws, &data)
             75        fmt.Println("data:", data)
             76        if err != nil {
             77            //移除出錯的鏈接
             78            delete(users, ws)
             79            fmt.Println("接收出錯")
             80            break
             81        }

             82
             83        data = strings.Replace(data, "\n"""0)
             84        err = json.Unmarshal([]byte(data), &userMsg)
             85        if err != nil {
             86            fmt.Println("解析數據異常")
             87            break
             88        }

             89        fmt.Println("請求數據類型:", userMsg.DataType)
             90
             91        switch userMsg.DataType {
             92        case "send":
             93            //賦值對應的昵稱到ws
             94            if _, ok := users[ws]; ok {
             95                users[ws] = userMsg.UserName
             96
             97                //清除連接人昵稱信息
             98                datas.UserDatas = make([]UserData, 0)
             99                //重新加載當前在線連接人
            100                for _, item := range users {
            101
            102                    userData := UserData{UserName: item}
            103                    datas.UserDatas = append(datas.UserDatas, userData)
            104                }

            105            }

            106            datas.UserMsgs = append(datas.UserMsgs, userMsg)
            107        }

            108    }

            109
            110}

            111
            112type UserMsg struct {
            113    UserName string
            114    Msg      string
            115    DataType string
            116}

            117
            118type UserData struct {
            119    UserName string
            120}

            121
            122type Datas struct {
            123    UserMsgs  []UserMsg
            124    UserDatas []UserData
            125}

            html5代碼:

            <!DOCTYPE html>
            <html lang="zh-CN">
            <head>
                <title></title>
                <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
                <!-- 新 Bootstrap 核心 CSS 文件 -->
                <link rel="stylesheet" >
                <script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
                <!--        <script src="http://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>-->
            </head>
            <body>
                <div class="container">
                    <div>內容:</div>
                    <div class="list-group" id="divShow">
                        <!--<div class="list-group-item list-group-item-success">1111</div>
                        <div class="list-group-item list-group-item-info">1111</div>
                        <div class="list-group-item list-group-item-warning">1111</div>
                        <div class="list-group-item list-group-item-danger">1111</div>-->
                    </div>
                    <div class="list-group" id="divUsers">
                        在線:<br />
                        <!--<div class="btn btn-default">111</div>-->

                    </div>
                    <div>
                        昵稱:<input class="form-control" id="txtUserName" value="紅領巾" type="text" maxlength="20" style="width: 30%; margin-bottom: 15px" />
                        聊聊:<textarea class="form-control" id="txtContent" autofocus rows="6" placeholder="想聊的內容" maxlength="200" required style="width: 60%; "></textarea>
                        <button class="btn btn-default" id="btnSend" style="margin-top:15px">發 送</button>
                    </div>
                </div>
            </body>
            </html>

            <script>

                var tool = function () {

                    var paperLoopNum = 0;
                    var paperTempleArr = [
                        '<div class="list-group-item list-group-item-success">{0}</div>',
                        '<div class="list-group-item list-group-item-info">{0}</div>',
                        '<div class="list-group-item list-group-item-warning">{0}</div>',
                        '<div class="list-group-item list-group-item-danger">{0}</div>'
                    ];

                    return {

                        paperDiv: function (val) {

                            var hl = paperTempleArr[paperLoopNum];
                            paperLoopNum++;
                            if (paperLoopNum >= paperTempleArr.length) { paperLoopNum = 0; }

                            return this.formart(hl, [val])
                        },
                        formart: function (str, arrVal) {

                            for (var i = 0; i < arrVal.length; i++) {
                                str = str.replace("{" + i + "}", arrVal[i]);
                            }
                            return str;
                        }
                    }
                }

                function showMsg(id, hl, isAppend) {

                    if (!isAppend) { $("#" + id).html(hl); } else {
                        $("#" + id).append(hl);
                    }
                }

                $(function () {

                    //初始化工具方法
                    var tl = new tool();

                    var wsUrl = "ws://172.16.9.6:8/webSocket";
                    ws = new WebSocket(wsUrl);

                    try {

                        ws.onopen = function () {

                            //showMsg("divShow", tl.paperDiv("連接服務器-成功"));
                        }

                        ws.onclose = function () {
                            if (ws) {
                                ws.close();
                                ws = null;
                            }
                            showMsg("divShow", tl.paperDiv("連接服務器-關閉"), true);
                        }

                        ws.onmessage = function (result) {

                            //console.log(result.data);
                            var data = JSON.parse(result.data);
                            $(data.UserMsgs).each(function (i, item) {
                                showMsg("divShow", tl.paperDiv("【" + item.UserName + "】:" + item.Msg), true);
                            });

                            var userDataShow = [];
                            $(data.UserDatas).each(function (i, item) {

                                userDataShow.push('<div class="btn btn-default">' + item.UserName + '</div>');

                            });
                            showMsg("divUsers", userDataShow.join(''), false);
                        }

                        ws.onerror = function () {
                            if (ws) {
                                ws.close();
                                ws = null;
                            }
                            showMsg("divShow", tl.paperDiv("連接服務器-關閉"), true);
                        }

                    } catch (e) {

                        alert(e.message);
                    }
                    $("#btnSend").on("click", function () {

                        var tContentObj = $("#txtContent");
                        var tContent = $.trim( tContentObj.val()).replace("/[\n]/g", "");
                        var tUserName = $.trim( $("#txtUserName").val()); tUserName = tUserName.length <= 0 ? "匿名" : tUserName;
                        if (tContent.length <= 0 || $.trim(tContent).length <= 0) { alert("請輸入發送內容!"); return; }
                        if (ws == null) { alert("連接失敗,請F5刷新頁面!"); return; }

                        var request = tl.formart('{"UserName": "{0}", "DataType": "{1}", "Msg": "{2}" }',
                                                 [tUserName, "send", tContent]);
                        ws.send(request);
                        tContentObj.val("");
                        tContentObj.val($.trim(tContentObj.val()).replace("/[\n]/g", ""));
                    });
                    $("#txtContent").on("keydown", function (event) {

                        if (event.keyCode == 13) {

                            $("#btnSend").trigger("click");
                        }
                    });
                })

            </script>

            效果圖:

              


             附件:http://m.shnenglu.com/Files/kenkao/GoWebsocket.zip

            posted on 2016-09-07 17:56 思月行云 閱讀(1290) 評論(0)  編輯 收藏 引用 所屬分類: Golang
            国内精品久久久久久久久| 国产99久久久国产精品~~牛| 国产精品美女久久久久av爽 | 久久综合给合久久狠狠狠97色| 久久夜色精品国产噜噜噜亚洲AV| 久久超碰97人人做人人爱| 久久伊人中文无码| 中文无码久久精品| 久久精品免费观看| 亚洲精品NV久久久久久久久久| 成人国内精品久久久久一区| 久久人人添人人爽添人人片牛牛| 国产精品久久自在自线观看| 亚洲AV日韩精品久久久久| 久久天天躁狠狠躁夜夜av浪潮| 国产精品乱码久久久久久软件| 久久国产精品一区二区| 午夜福利91久久福利| 久久久久人妻精品一区三寸蜜桃| 99久久久国产精品免费无卡顿| 久久久WWW免费人成精品| AV无码久久久久不卡网站下载| 亚洲色欲久久久久综合网| 91精品日韩人妻无码久久不卡| 久久99国产精品99久久| 国产成年无码久久久免费| 久久久久国产日韩精品网站| 精品亚洲综合久久中文字幕| 无码精品久久久久久人妻中字 | 亚洲精品无码久久毛片| 亚洲国产精品热久久| 狠狠色丁香久久婷婷综合五月| 久久99热这里只有精品国产| 久久久久无码国产精品不卡| 国产成人精品久久亚洲高清不卡 | 国产午夜免费高清久久影院| 色欲综合久久躁天天躁蜜桃| 亚洲AV无一区二区三区久久| 久久久久久毛片免费播放| 午夜精品久久久久久99热| 午夜久久久久久禁播电影|