青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2017年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234


專注即時(shí)通訊及網(wǎng)游服務(wù)端編程
------------------------------------
Openresty 官方模塊
Openresty 標(biāo)準(zhǔn)模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉(zhuǎn)載,并在文章開(kāi)頭給出了原文出處,如有再轉(zhuǎn),敬請(qǐng)保留相關(guān)信息,這是大家對(duì)原創(chuàng)作者勞動(dòng)成果的自覺(jué)尊重!!如為您帶來(lái)不便,請(qǐng)于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊(cè)

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 221729
  • 排名 - 117

最新評(píng)論

閱讀排行榜

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("啟動(dòng)時(shí)間")
 22    fmt.Println(time.Now())
 23
 24    //初始化
 25    datas = Datas{}
 26    users = make(map[*websocket.Conn]string)
 27
 28    //綁定效果頁(yè)面
 29    http.HandleFunc("/", h_index)
 30    //綁定socket方法
 31    http.Handle("/webSocket", websocket.Handler(h_webSocket))
 32    //開(kāi)始監(jiān)聽(tīng)
 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        //判斷是否重復(fù)連接
 48        if _, ok := users[ws]; !ok {
 49            users[ws] = "匿名"
 50        }

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

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

 69            }

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

 72
 73        fmt.Println("開(kāi)始解析數(shù)據(jù)")
 74        err := websocket.Message.Receive(ws, &data)
 75        fmt.Println("data:", data)
 76        if err != nil {
 77            //移除出錯(cuò)的鏈接
 78            delete(users, ws)
 79            fmt.Println("接收出錯(cuò)")
 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("解析數(shù)據(jù)異常")
 87            break
 88        }

 89        fmt.Println("請(qǐng)求數(shù)據(jù)類型:", userMsg.DataType)
 90
 91        switch userMsg.DataType {
 92        case "send":
 93            //賦值對(duì)應(yīng)的昵稱到ws
 94            if _, ok := users[ws]; ok {
 95                users[ws] = userMsg.UserName
 96
 97                //清除連接人昵稱信息
 98                datas.UserDatas = make([]UserData, 0)
 99                //重新加載當(dāng)前在線連接人
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>內(nèi)容:</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="紅領(lǐng)巾" type="text" maxlength="20" style="width: 30%; margin-bottom: 15px" />
            聊聊:<textarea class="form-control" id="txtContent" autofocus rows="6" placeholder="想聊的內(nèi)容" maxlength="200" required style="width: 60%; "></textarea>
            <button class="btn btn-default" id="btnSend" style="margin-top:15px">發(fā) 送</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("連接服務(wù)器-成功"));
            }

            ws.onclose = function () {
                if (ws) {
                    ws.close();
                    ws = null;
                }
                showMsg("divShow", tl.paperDiv("連接服務(wù)器-關(guān)閉"), 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("連接服務(wù)器-關(guān)閉"), 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("請(qǐng)輸入發(fā)送內(nèi)容!"); return; }
            if (ws == null) { alert("連接失敗,請(qǐng)F(tuán)5刷新頁(yè)面!"); 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://www.shnenglu.com/Files/kenkao/GoWebsocket.zip

posted on 2016-09-07 17:56 思月行云 閱讀(1301) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Golang
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美精品一区二区在线观看 | 红桃视频国产一区| 欧美激情一区| 久久久噜久噜久久综合| 亚洲综合二区| 艳女tv在线观看国产一区| 欧美成人精品一区| 久久精品欧洲| 午夜精品在线观看| 亚洲免费视频成人| 国产在线观看精品一区二区三区| 欧美午夜a级限制福利片| 欧美电影电视剧在线观看| 久久久久国产精品一区三寸| 欧美精品久久久久久久| 国产一区二区观看| 国产在线不卡| 一区二区高清| 一区二区三区欧美激情| 久久精品国产77777蜜臀| 亚洲精品自在在线观看| 亚洲乱码国产乱码精品精98午夜| 午夜伦理片一区| 久久久久久久尹人综合网亚洲 | 国产精品一区二区久激情瑜伽| 欧美激情一区三区| 国产在线成人| 性欧美精品高清| 久久精品国产99国产精品| 亚洲黄色性网站| 亚洲高清在线观看一区| 国产精品日韩在线观看| 久久久噜噜噜| 日韩亚洲欧美一区二区三区| 国产欧美一区二区三区沐欲| 欧美视频福利| 国产精品乱码一区二区三区| 欧美三级欧美一级| 韩国成人理伦片免费播放| 在线精品高清中文字幕| 国产精品免费看| 亚洲精品国产欧美| 亚洲国产高清一区| 欧美影视一区| 久久免费观看视频| 一本大道av伊人久久综合| 久久精品欧洲| 亚洲欧美国产日韩中文字幕| 欧美精品v日韩精品v国产精品| 国产日韩欧美| 国产一区二区三区黄| 99re6这里只有精品视频在线观看| 欧美一区二区三区婷婷月色| 91久久精品久久国产性色也91| 欧美一区二区视频网站| 亚洲已满18点击进入久久| 欧美国产精品专区| 欧美国产精品久久| 在线观看亚洲视频| 久久成人国产精品| 中文av一区二区| 欧美一区二区高清在线观看| 欧美日韩亚洲天堂| 国产视频亚洲| 午夜免费电影一区在线观看| 99日韩精品| 欧美国产视频在线| 亚洲韩国日本中文字幕| 一区二区三区精品国产| 欧美福利影院| 老司机一区二区三区| 久久久之久亚州精品露出| 国产区日韩欧美| 香蕉国产精品偷在线观看不卡| 狂野欧美性猛交xxxx巴西| 欧美88av| 欧美在线视频观看免费网站| 欧美 日韩 国产精品免费观看| 黄色成人在线| 久久av一区二区| 午夜亚洲福利| 国产日韩一区二区三区| 欧美伊久线香蕉线新在线| 亚洲欧美激情诱惑| 国产精品美女在线观看| 亚洲欧美视频在线| 亚洲午夜一区二区| 国产精品久久久久9999吃药| 亚洲综合视频1区| 亚洲激情女人| 欧美jjzz| 亚洲小视频在线观看| 性久久久久久久久久久久| 亚洲免费av电影| 久久久久国产精品一区三寸| 好吊色欧美一区二区三区四区| 久久久久一区二区| 久久精品在线| 国产一区二区视频在线观看| 久久久国产精品亚洲一区| 久久久欧美精品| 亚洲人成亚洲人成在线观看| 亚洲国产成人午夜在线一区| 亚洲精品日产精品乱码不卡| 欧美日韩一二三四五区| 一本色道久久88综合亚洲精品ⅰ | 欧美国产日韩视频| 免费成人网www| 亚洲第一中文字幕在线观看| 欧美不卡一卡二卡免费版| 欧美日韩在线三区| 欧美一区二区三区免费观看视频| 午夜亚洲视频| 国产午夜精品久久久| 欧美xx69| 欧美成人午夜免费视在线看片| 亚洲午夜国产一区99re久久| 校园春色综合网| 亚洲国产精品激情在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美性大战久久久久| 久久久久久久综合色一本| 欧美3dxxxxhd| 欧美亚洲自偷自偷| 另类春色校园亚洲| 亚洲免费一区二区| 牛牛国产精品| 欧美一区二区免费视频| 免费日韩精品中文字幕视频在线| 亚洲一级片在线看| 久久久精品午夜少妇| 一二三区精品| 欧美一区综合| 一本久道综合久久精品| 久久se精品一区精品二区| 日韩一二在线观看| 亚洲一区免费在线观看| 亚洲国产视频一区二区| 亚洲一线二线三线久久久| 亚洲福利在线看| 亚洲一级黄色| 亚洲日本中文字幕| 欧美一二三视频| av不卡在线观看| 久久gogo国模裸体人体| 亚洲中无吗在线| 久久久国产一区二区三区| 亚洲一区尤物| 欧美高清免费| 久久久五月天| 欧美精品成人| 噜噜噜噜噜久久久久久91| 国产精品高潮久久| 亚洲成人自拍视频| 国模精品一区二区三区色天香| 在线亚洲高清视频| 在线观看国产成人av片| 久久爱www.| 国产精品成人在线| 亚洲国产99| 今天的高清视频免费播放成人| 一区二区电影免费观看| 亚洲精品视频在线看| 久久国产主播精品| 欧美一区二区观看视频| 欧美成人高清视频| 久久久综合网站| 国产精品一区二区久久久| 99re66热这里只有精品3直播| 亚洲电影av在线| 久久岛国电影| 久久精品99国产精品酒店日本| 欧美日韩天堂| 亚洲精品在线观| 亚洲伦理一区| 蜜乳av另类精品一区二区| 久久久精品2019中文字幕神马| 国产精品a久久久久| 欧美国产日韩在线观看| 一区在线免费| 久久超碰97人人做人人爱| 欧美在线一区二区| 国产精品久久久久免费a∨大胸| 亚洲精品视频在线| 99精品视频一区| 欧美国产综合视频| 欧美激情按摩在线| 极品尤物av久久免费看| 另类国产ts人妖高潮视频| 免费日韩成人| 在线成人激情| 另类av导航| 亚洲福利视频一区| 亚洲乱码久久| 欧美日韩成人在线| 浪潮色综合久久天堂| 国产一区二区三区在线播放免费观看| 亚洲免费影视| 久久福利视频导航| 国产亚洲欧美aaaa|