html5+go+websocket簡單實例代碼

来源:http://www.cnblogs.com/wangrudong003/archive/2016/05/27/5535689.html
-Advertisement-
Play Games

這次的就直接發放代碼截圖吧,應該是用go語言做後臺一個簡易的聊天,這裡沒用到什麼特別的知識,最朴實的來實現效果,主要目的是分享下h5怎麼用websocket,go搭建websocket服務的主要部分。 go代碼部分: 1 // WebChat project main.go 2 package ma ...


這次的就直接發放代碼截圖吧,應該是用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 }
View Code

 

  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>
View Code

  效果圖:

  

   主要的備註都寫在代碼裡面了,希望更多的朋友相互分享交流。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 選自Mr.kuang http://www.cnblogs.com/kuangbin/archive/2012/08/14/2638803.html /* * pku3461(Oulipo), hdu1711(Number Sequence) * 這個模板 字元串是從0開始的 * Next數組是從1... ...
  • 布爾類型其實可以算是一種特殊的數字,下麵是 help() 函數得到的幫助信息: Help on class bool in module __builtin__: class bool(int) | bool(x) -> bool | | Returns True when the argument ...
  • 1.什麼是Servlet? Servlet(Servlet Applet),全程Java Servlet,是用Java編寫的伺服器端程式,其主要功能在於互動式地瀏覽和修改數據,生成動態WEB內容。俠義的servlet是指Java語言實現的一個介面,廣義的servlet是指任何實現了這個servlet ...
  • 最初版本: #include<stdio.h> int checkPassword(); int add(int x,int y); int sub(int x,int y); int multi(int x,int y); float quo(float x1,float y1); int com ...
  • PHP實現簡易的模板引擎 1.MVC簡介 MVC 是一種使用 MVC(Model View Controller 模型 視圖 控制器)設計創建 Web 應用程式的模式(詳情自己百度): 1. Model(模型)表示應用程式核心(比如資料庫記錄列表)。 2. View(視圖)顯示數據(資料庫記錄) 3 ...
  • 三元運算 三元運算又叫三目運算,是對簡單的條件語句的縮寫,例如if判斷 # 標準if判斷語法 if 1 == 1: name = "yes" else: name = "no" # 如果 1==1 成立,name = "yes", 否則 name = "no" # 三元運算簡寫語法 name = " ...
  • 好幾年前我在做一些自動化的腳本時,腦子裡也閃過這樣的想法:能不能直接把瀏覽器的cookies取出來用呢? 直到昨天看到代碼《python模擬發送動彈》,想起來當年我也曾經有類似的想法沒能完成,那就優先拿這個練手,之後的代碼也會用這個功能。 直接從瀏覽器中取出cookies,有以下好處和用途: 1、不 ...
  • 一、String對象 1、string s; s.size(); //返回的是s中字元的個數,也是s的長度; //string對象最後沒有加空字元 //size()返回的是string::size_type類型,也就是unsigned類型,而不是int類型 2、兩個string對象的相加 strin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...