html5+go+websocket简单实例代码
这次的就直接发放代码截图吧,应该是用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 > {
- 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, )
- }
- 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", "", )
- 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, )
- //重新加载当前在线连接人
- 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 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" 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 class="container">
- <div>内容:</div>
- <div class="list-group" id="divShow">
- <!--<div class="list-group-item list-group-item-success"></div>
- <div class="list-group-item list-group-item-info"></div>
- <div class="list-group-item list-group-item-warning"></div>
- <div class="list-group-item list-group-item-danger"></div>-->
- </div>
- <div class="list-group" id="divUsers">
- 在线:<br />
- <!--<div class="btn btn-default"></div>-->
- </div>
- <div>
- 昵称:<input class="form-control" id="txtUserName" value="红领巾" type="text" maxlength="" style="width: 30%; margin-bottom: 15px" />
- 聊聊:<textarea class="form-control" id="txtContent" autofocus rows="" placeholder="想聊的内容" maxlength="" 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 = ;
- 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 = ; }
- return this.formart(hl, [val])
- },
- formart: function (str, arrVal) {
- for (var i = ; 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 <= ? "匿名" : tUserName;
- if (tContent.length <= || $.trim(tContent).length <= ) { 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 == ) {
- $("#btnSend").trigger("click");
- }
- });
- })
- </script>
效果图:
主要的备注都写在代码里面了,希望更多的朋友相互分享交流。
html5+go+websocket简单实例代码的更多相关文章
- 详解 HTML5 中的 WebSocket 及实例代码-做弹幕
原文链接:http://www.php.cn/html5-tutorial-363345.html
- websocket简单实例
只需要两个文件即可,一个服务端,一个前端,一下示例为模拟简单的聊天程序: 服务端: package com.test.websocket; import java.io.IOException; im ...
- 基于H5的WebSocket简单实例
客户端代码: <html> <head> <script> var socket; if ("WebSocket" in window) { v ...
- .net自定义事件,经典简单实例代码
1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...
- vue简单实例代码
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 关于w3school的html5部分output 元素实例代码(点亲自试一试进去)的问题纠正
修复: 将原来的 = 号修改成 <input type="button" onclick="resCalc()" value ="=" ...
- KVC/KVO简单实例代码
Person.h #import<Foundation/Foundation.h> @classAccount; @interfacePerson :NSObject{ @private ...
- mysqli数据库操作简单实例
mysqli数据库操作简单实例 代码 结果
- TERSUS无代码开发(笔记09)-简单实例前端样式设计
前端常用样式设计 =========================================================================================== ...
随机推荐
- C# 利用性能计数器监控网络状态
本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...
- 深入解析Sqlite的完美替代者,android数据库新王者——Realm
写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...
- MVC还是MVVM?或许VMVC更适合WinForm客户端
最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...
- Android中的LinearLayout布局
LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了, 线性布局是按照垂直方向(vertical)或水平方向 ...
- angular2之前端篇—1(node服务器分支)
上一篇.net core和angular2之前端篇-1 使用的是dotnet模板.之所以用它,因为想用他写webapi,但是写道下一篇的时候遇到点问题,所以先写个分支测试一下.这次是用Node作为服务 ...
- Java 进阶 hello world! - 中级程序员之路
Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...
- T-SQL字符串相加之后被截断的那点事
本文出处:http://www.cnblogs.com/wy123/p/6217772.html 字符串自身相加, 虽然赋值给了varchar(max)类型的变量,在某些特殊情况下仍然会被“截断”,这 ...
- webService
什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 1:从WebService的工作模式上 ...
- js中的null 和undefined
参考链接:http://blog.csdn.net/qq_26676207/article/details/53100912 http://www.ruanyifeng.com/blog/2014/0 ...
- Princeton Algorithms week3 Assignment
这周编程作业是实现检测点共线的算法.和排序算法有关系的地方在于,对斜率排序后可以很快的检测出来哪些点是共线的,另外这个算法的瓶颈也在于排序的性能. 一点收获: java传参数时传递的是值,这很多人都知 ...