• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > html5使用go+websocket搭建websocket服务的实例

html5使用go+websocket搭建websocket服务的实例

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含go+websocket,websocket,html5等相关知识,匿名希望在学习及工作中可以帮助到您

这次的就直接发放代码截图吧,应该是用go语言做后台一个简易的聊天,这里没用到什么特别的知识,最朴实的来实现效果,主要目的是分享下h5怎么用websocket,go搭建websocket服务的主要部分。

go代码部分:

// WebChat project main.go
package main

import (
    "fmt"
    "net/http"
    "time"

    "encoding/json"

    "strings"

    "golang.org/x/net/websocket"
)

//全局信息
var datas Datas
var users map[*websocket.Conn]string

func main() {
    fmt.Println("启动时间")
    fmt.Println(time.Now())

    //初始化
    datas = Datas{}
    users = make(map[*websocket.Conn]string)

    //绑定效果页面
    http.HandleFunc("/", h_index)
    //绑定socket方法
    http.Handle("/webSocket", websocket.Handler(h_webSocket))
    //开始监听
    http.ListenAndServe(":8", nil)
}

func h_index(w http.ResponseWriter, r *http.Request) {

    http.ServeFile(w, r, "index.html")
}

func h_webSocket(ws *websocket.Conn) {

    var userMsg UserMsg
    var data string
    for {

        //判断是否重复连接
        if _, ok := users[ws]; !ok {
            users[ws] = "匿名"
        }
        userMsgsLen := len(datas.UserMsgs)
        fmt.Println("UserMsgs", userMsgsLen, "users长度:", len(users))

        //有消息时,全部分发送数据
        if userMsgsLen > 0 {
            b, errMarshl := json.Marshal(datas)
            if errMarshl != nil {
                fmt.Println("全局消息内容异常...")
                break
            }
            for key, _ := range users {
                errMarshl = websocket.Message.Send(key, string(b))
                if errMarshl != nil {
                    //移除出错的链接
                    delete(users, key)
                    fmt.Println("发送出错...")
                    break
                }
            }
            datas.UserMsgs = make([]UserMsg, 0)
        }

        fmt.Println("开始解析数据...")
        err := websocket.Message.Receive(ws, &data)
        fmt.Println("data:", data)
        if err != nil {
            //移除出错的链接
            delete(users, ws)
            fmt.Println("接收出错...")
            break
        }

        data = strings.Replace(data, "\n", "", 0)
        err = json.Unmarshal([]byte(data), &userMsg)
        if err != nil {
            fmt.Println("解析数据异常...")
            break
        }
        fmt.Println("请求数据类型:", userMsg.DataType)

        switch userMsg.DataType {
        case "send":
            //赋值对应的昵称到ws
            if _, ok := users[ws]; ok {
                users[ws] = userMsg.UserName

                //清除连接人昵称信息
                datas.UserDatas = make([]UserData, 0)
                //重新加载当前在线连接人
                for _, item := range users {

                    userData := UserData{UserName: item}
                    datas.UserDatas = append(datas.UserDatas, userData)
                }
            }
            datas.UserMsgs = append(datas.UserMsgs, userMsg)
        }
    }

}

type UserMsg struct {
    UserName string
    Msg      string
    DataType string
}

type UserData struct {
    UserName string
}

type Datas struct {
    UserMsgs  []UserMsg
    UserDatas []UserData
}

  html代码部分:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <!--        <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>-->
</head>
<body>
    <div>
        <div>内容:</div>
        <div 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 id="divUsers">
            在线:<br />
            <!--<div class="btn btn-default">111</div>-->

        </div>
        <div>
            昵称:<input id="txtUserName" value="红领巾" type="text" maxlength="20" style="width: 30%; margin-bottom: 15px" />
            聊聊:<textarea 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.Use
  


 

您可能想查找下面的文章:

  • html5使用go+websocket搭建websocket服务的实例

相关文章

  • 2018-12-03用HTML5制作数字时钟的教程_html5教程技巧
  • 2018-12-0320个为前端开发者准备的文档和指南(1)
  • 2017-08-06程序设计HTML5 Canvas API
  • 2018-12-03HTML5混合开发二维码扫描以及调用本地摄像头实例教程
  • 2018-12-03H5的标题书写问题
  • 2018-12-03怎样用H5计算手机摇动次数
  • 2018-12-03HTML5实践-CSS3 Media Queries详情介绍
  • 2018-12-03HTML5和jQuery实现弹出创意搜索框层的方法
  • 2018-12-03html5如何使用canvas绘制“钟表”图案?(代码实例)
  • 2018-12-03使用HTML5画布实现的超棒javascript动画仪表板:gauge.js?1.1.2

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • 关于canvas线条的属性
    • HTML5 新增结构元素
    • HTML5 File API改善网页上传功能
    • 怎么用CSS设置记录用户密码
    • 对Tap事件和Tap点透原理的分析
    • 混合移动开发框架详解
    • 分享h5调用摄像头实现拍照的实例教程
    • 用H5调用支付微信公众号支付的解析
    • Html5 audio标签样式的修改 _html5教程技巧
    • HTML5结合互联网+ 实现的3D隧道(附代码)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有