html5+go+websocket简单实例代码

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

go代码部分:

  1 // WebChat project main.go
  2 package main
  3
  4 import (
  5     "fmt"
  6     "net/http"
  7     "time"
  8
  9     "encoding/json"
 10
 11     "strings"
 12
 13     "golang.org/x/net/websocket"
 14 )
 15
 16 //全局信息
 17 var datas Datas
 18 var users map[*websocket.Conn]string
 19
 20 func 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
 36 func h_index(w http.ResponseWriter, r *http.Request) {
 37
 38     http.ServeFile(w, r, "index.html")
 39 }
 40
 41 func 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
112 type UserMsg struct {
113     UserName string
114     Msg      string
115     DataType string
116 }
117
118 type UserData struct {
119     UserName string
120 }
121
122 type Datas struct {
123     UserMsgs  []UserMsg
124     UserDatas []UserData
125 }

  html代码部分:

  1 <!DOCTYPE html>
  2 <html lang="zh-CN">
  3 <head>
  4     <title></title>
  5     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  6     <!-- 新 Bootstrap 核心 CSS 文件 -->
  7     <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
  8     <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
  9     <!--        <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>-->
 10 </head>
 11 <body>
 12     <div class="container">
 13         <div>内容:</div>
 14         <div class="list-group" id="divShow">
 15             <!--<div class="list-group-item list-group-item-success">1111</div>
 16             <div class="list-group-item list-group-item-info">1111</div>
 17             <div class="list-group-item list-group-item-warning">1111</div>
 18             <div class="list-group-item list-group-item-danger">1111</div>-->
 19         </div>
 20         <div class="list-group" id="divUsers">
 21             在线:<br />
 22             <!--<div class="btn btn-default">111</div>-->
 23
 24         </div>
 25         <div>
 26             昵称:<input class="form-control" id="txtUserName" value="红领巾" type="text" maxlength="20" style="width: 30%; margin-bottom: 15px" />
 27             聊聊:<textarea class="form-control" id="txtContent" autofocus rows="6" placeholder="想聊的内容" maxlength="200" required style="width: 60%; "></textarea>
 28             <button class="btn btn-default" id="btnSend" style="margin-top:15px">发 送</button>
 29         </div>
 30     </div>
 31 </body>
 32 </html>
 33
 34 <script>
 35
 36     var tool = function () {
 37
 38         var paperLoopNum = 0;
 39         var paperTempleArr = [
 40             ‘<div class="list-group-item list-group-item-success">{0}</div>‘,
 41             ‘<div class="list-group-item list-group-item-info">{0}</div>‘,
 42             ‘<div class="list-group-item list-group-item-warning">{0}</div>‘,
 43             ‘<div class="list-group-item list-group-item-danger">{0}</div>‘
 44         ];
 45
 46         return {
 47
 48             paperDiv: function (val) {
 49
 50                 var hl = paperTempleArr[paperLoopNum];
 51                 paperLoopNum++;
 52                 if (paperLoopNum >= paperTempleArr.length) { paperLoopNum = 0; }
 53
 54                 return this.formart(hl, [val])
 55             },
 56             formart: function (str, arrVal) {
 57
 58                 for (var i = 0; i < arrVal.length; i++) {
 59                     str = str.replace("{" + i + "}", arrVal[i]);
 60                 }
 61                 return str;
 62             }
 63         }
 64     }
 65
 66     function showMsg(id, hl, isAppend) {
 67
 68         if (!isAppend) { $("#" + id).html(hl); } else {
 69             $("#" + id).append(hl);
 70         }
 71     }
 72
 73     $(function () {
 74
 75         //初始化工具方法
 76         var tl = new tool();
 77
 78         var wsUrl = "ws://172.16.9.6:8/webSocket";
 79         ws = new WebSocket(wsUrl);
 80
 81         try {
 82
 83             ws.onopen = function () {
 84
 85                 //showMsg("divShow", tl.paperDiv("连接服务器-成功"));
 86             }
 87
 88             ws.onclose = function () {
 89                 if (ws) {
 90                     ws.close();
 91                     ws = null;
 92                 }
 93                 showMsg("divShow", tl.paperDiv("连接服务器-关闭"), true);
 94             }
 95
 96             ws.onmessage = function (result) {
 97
 98                 //console.log(result.data);
 99                 var data = JSON.parse(result.data);
100                 $(data.UserMsgs).each(function (i, item) {
101                     showMsg("divShow", tl.paperDiv("【" + item.UserName + "】:" + item.Msg), true);
102                 });
103
104                 var userDataShow = [];
105                 $(data.UserDatas).each(function (i, item) {
106
107                     userDataShow.push(‘<div class="btn btn-default">‘ + item.UserName + ‘</div>‘);
108
109                 });
110                 showMsg("divUsers", userDataShow.join(‘‘), false);
111             }
112
113             ws.onerror = function () {
114                 if (ws) {
115                     ws.close();
116                     ws = null;
117                 }
118                 showMsg("divShow", tl.paperDiv("连接服务器-关闭"), true);
119             }
120
121         } catch (e) {
122
123             alert(e.message);
124         }
125         $("#btnSend").on("click", function () {
126
127             var tContentObj = $("#txtContent");
128             var tContent = $.trim( tContentObj.val()).replace("/[\n]/g", "");
129             var tUserName = $.trim( $("#txtUserName").val()); tUserName = tUserName.length <= 0 ? "匿名" : tUserName;
130             if (tContent.length <= 0 || $.trim(tContent).length <= 0) { alert("请输入发送内容!"); return; }
131             if (ws == null) { alert("连接失败,请F5刷新页面!"); return; }
132
133             var request = tl.formart(‘{"UserName": "{0}", "DataType": "{1}", "Msg": "{2}" }‘,
134                                      [tUserName, "send", tContent]);
135             ws.send(request);
136             tContentObj.val("");
137             tContentObj.val($.trim(tContentObj.val()).replace("/[\n]/g", ""));
138         });
139         $("#txtContent").on("keydown", function (event) {
140
141             if (event.keyCode == 13) {
142
143                 $("#btnSend").trigger("click");
144             }
145         });
146     })
147
148 </script>

  效果图:

  

主要的备注都写在代码里面了,希望更多的朋友相互分享交流。

时间: 2024-09-29 19:38:52

html5+go+websocket简单实例代码的相关文章

原生ajax调用数据简单实例代码

原生ajax调用数据简单实例代码:由于jQuery的盛行,现在使用较多的是jQuery封装好了的ajax,因为解决了浏览器兼容性问题,这对程序员来说就等于去掉了一个心头大患,但并非原生ajax就销声匿迹,并且本人感觉还是对原生的ajax有所了解的好,下面就是一段ajax数据调用的实例代码,非常的简单,初学者可以参考一下.代码如下:一.兼容浏览器部分: function xmlHttpR() { var xmlhttp; if(window.XMLHttpRequest) { xmlhttp=ne

可以固定的顶部的导航菜单简单实例代码

可以固定的顶部的导航菜单简单实例代码:固定于网页顶部的导航栏效果在当下网站比较流行,所谓的固定于网页的顶部一般来说并不是一直固定于顶部,而是在开始是位于某一个位置,当下拉滚动条使其到达顶部的时候才会固定在顶部,下面通过代码实例介绍一下如何实现此效果.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" con

websocket简单实例

只需要两个文件即可,一个服务端,一个前端,一下示例为模拟简单的聊天程序: 服务端: package com.test.websocket; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; impor

关于w3school的html5部分output 元素实例代码(点亲自试一试进去)的问题纠正

修复: 将原来的 =  号修改成 <input type="button" onclick="resCalc()" value ="=" />,否则没有事件去激活JS计算方法: 原文网址:http://www.w3school.com.cn/tiy/t.asp?f=html5_form_output <!DOCTYPE HTML><html><head><script type="t

HTML5中的Web Storage(sessionStorage||localStorage)理解与简单实例

Web Storage是什么? Web Storage功能,顾名思义,就是在Web上针对客户端本地储存数据的功能,具体来说Web Storage分为两种: sessionStorage: 将数据保存在session对象中,所谓session是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.session对象可以用来保存在这段时间内所要求保存的任何数据. localStorage: 将数据保存在客户端本地的硬件设备(通常指硬盘,当然可以是其他的硬

Javascript 实现简单计算器实例代码

Javascript 实现简单计算器实例代码 这篇文章主要介绍了Javascript 实现简单计算器实例代码的相关资料,需要的朋友可以参考下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

ul、li列表简单实用代码实例

ul.li列表简单实用代码实例: 利用ul和li可以实现列表效果,下面就是一个简单的演示. 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.51texiao.cn/" /> <title>蚂蚁部落</title> &

认识HTML5的WebSocket

认识HTML5的WebSocket 在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器.让我们看一看HTML5的WebSocket API:它可用于客户端.服务器端.而且有一个优秀的第三方API,名为Socket.IO. 一.什么是WebSocket API? WebSocket API是下一代客户端-

HTML5 and Websocket

在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器.让我们看一看HTML5的WebSocket API:它可用于客户端.服务器端.而且有一个优秀的第三方API,名为Socket.IO. 一.什么是WebSocket API? WebSocket API是下一代客户端-服务器的异步通信方法.该通信取代了单