话不多说直接上代码。

golang代码:

package mainimport ("fmt""net/http""os""reflect""time""unsafe""github.com/gorilla/websocket"
)type HttpHandler struct {http.Handler
}func main() {var httpHandler HttpHandlerhttp.Handle("/connect", httpHandler)if err := http.ListenAndServe(":9999", nil); err != nil {fmt.Println("程序退出")os.Exit(1)}
}func (httpHandler HttpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {fmt.Println("程序进入监听>>")var upgrader = websocket.Upgrader{//解决跨域问题CheckOrigin: func(r *http.Request) bool {return true},}conn, err := upgrader.Upgrade(w, r, nil)if err != nil {fmt.Println("upgrade error:", err)return}defer conn.Close()conn.SetReadDeadline(time.Now().Add(6*time.Second))conn.SetPongHandler(func(string) error {fmt.Println("接收心跳响应<<")conn.SetReadDeadline(time.Now().Add(6*time.Second))return nil})ticker := time.NewTicker(2*time.Second)go func() {for {//从定时器中获取数据_ = <-ticker.Cfmt.Println("发送心跳包>>")conn.WriteMessage(websocket.PingMessage, []byte{})}}()defer ticker.Stop()for {messageType, message, err := conn.ReadMessage()if err != nil {fmt.Println("接收异常:", err)break}fmt.Println(fmt.Sprintf("接收消息内容 >>%s", message))respMessage := fmt.Sprintf("I am Server, %s.", time.Now().Format("2006-01-02 15:04:05"))err = conn.WriteMessage(messageType, String2Bytes(respMessage))if err != nil {fmt.Println("发送异常:", err)break}}
}func String2Bytes(s string) []byte {sh := (*reflect.StringHeader)(unsafe.Pointer(&s))bh := reflect.SliceHeader{Data: sh.Data,Len:  sh.Len,Cap:  sh.Len,}return *(*[]byte)(unsafe.Pointer(&bh))
}

web代码:

<html><head><meta charset="UTF-8"/></head><body><div><button onclick="start()" style="width:80px;height:30px;line-height:24px;">开始</button><button onclick="stop()" style="width:80px;height:30px;line-height:24px;">停止</button><button onclick="reset()" style="width:80px;height:30px;line-height:24px;">重置</button></div><div id="connect-show">未连接</div><div id="rec-show"></div></body><script type="text/javascript">var ws;var interval;function rewebsocket() {//ws = new WebSocket("ws://127.0.0.1:9999/connect");ws = new WebSocket("ws://192.168.3.47:9999/connect");//连接建立时触发ws.onopen = function() {document.getElementById("connect-show").innerHTML = "连接成功";send(ws);}//连接关闭时触发ws.onclose = function() {document.getElementById("connect-show").innerHTML = "连接已关闭";}//通信发生错误时触发ws.onerror = function() {document.getElementById("connect-show").innerHTML = "连接通讯成功";}//客户端接收服务端数据时触发ws.onmessage = function(e) {var recMsg = e.data;var element = document.getElementById("rec-show");var nodes = element.childNodes;if (nodes && nodes.length >= 20) {element.removeChild(nodes[nodes.length-1])}element.innerHTML = ("<div>" + recMsg + "</div>" + element.innerHTML);}}//启动function start() {if (ws == undefined || ws.readyState >= 2) {rewebsocket();}}//停止function stop() {clearInterval(interval);closeWebsocket(ws);interval = undefined;ws = undefined;}//重置function reset() {stop();document.getElementById("connect-show").innerHTML = "未连接";document.getElementById("rec-show").innerHTML = "";start();}//消息发送策略function send(ws) {interval = setInterval(() => {ws.send("I am client, " + getTime() + ".")},1000);}//获取客户端年月日时分秒function getTime() {return new Date( +new Date() + 8 * 3600 * 1000 ).toJSON().substr(0,19).replace("T"," ");}//关闭websocket连接function closeWebsocket(ws) {try {if (ws != undefined && ws.readyState < 2) {ws.close();}} catch (err){}}</script>
</html>

以上示例中使用服务端心跳方式实现健康检查,也可以改为客户端心跳方式。

golang+websocket实现相关推荐

  1. golang websocket 聊天室demo

    近期偶然的机会看到一些go的websocket技术方案,顺便写了个demo,玩了一下: 首先安装websocket包 go get code.google.com/p/go.net/websocket ...

  2. Golang websocket

    2019独角兽企业重金招聘Python工程师标准>>> 环境:Win10 + Go1.9.2 1.先下载并引用golang的websocket库 ①golang的官方库都在https ...

  3. golang websocket conn.close关闭错误_Websockets 与在golang中的应用

    Network socket Network socket或socket是一台或多台服务器中不同应用程序之间相互通信的接口.socket可以用于不同的网络协议, 如HTTP, FTP等. 切不同的so ...

  4. golang websocket绑定用户_Golang(五)最佳Web框架对比

    Golang是一门快速增长的语言,专为构建简单.快速且可靠的软件而设计.它提供的net/http库对于HTTP协议实现非常好,基于此再构造框架会更容易,因此生态中出现了很多框架.本文将从流行度.社区支 ...

  5. golang websocket 模拟pc扫码登录

    github 地址 go-qrcode-login-mock 第一次写golang程序,用来学习的. 模拟PC浏览器二维码扫描登录的过程,手机APP端用 微信 模拟,简单起见,APP端只要发送toke ...

  6. golang websocket简单实现

    包 go get github.com/gorilla/websocket 相关方法 获取连接 func (u *Upgrader) Upgrade(w http.ResponseWriter,r * ...

  7. Golang websocket 客户端开发

    文章目录 client 示例01 client 示例02 client 示例03 client 示例01 package mainimport ("flag""log&q ...

  8. golang websocket wss 遇到 dial: x509 错误

    客户端调用代码 websocket.DefaultDialer.Dial(url, headers) 解决方法 修改客户端代码如下,跳过证书验证 websocket.Dialer{TLSClientC ...

  9. golang websocket 一个语音聊天室

    原版是这位仁兄的https://github.com/99MyCql/chatRoom.我添加了图片和语音功能.因为H5的录音功能是需要https的,所以又在源码中添加了https的支持并修改ngin ...

最新文章

  1. 复旦计算机学院徐老师,复旦大学信息科学与技术学院徐跃东副研究员到课题组访问交流...
  2. SmartGridView(VB)
  3. bitcask存储引擎
  4. hdu 2833(Floyd + dp)
  5. js function如何传入参数未字符串_JavaScript 学习之路- JS 小测验
  6. python 遍历文件中的文件,文件名
  7. CentOS 7.4 ifconfig, ip/ss, nmcli, nmtui, 配置文件 修改ip信息用法
  8. ApiPost报TypeError: Cannot read property ‘oauth‘ of undefined的解决方案
  9. .Net下的XML序列化(一)
  10. jQuery操作数组的工具方法
  11. 作为开发你必须知道的WebSocket详解
  12. 案例4-4 Windows消息队列 (25 分)(优先队列的优先级设定)
  13. java 并行框架_JAVA并行框架学习之ForkJoin
  14. 【全网最全】100款七夕节情人节表白网页制作HTML+CSS+JS
  15. 分子动力学模拟-gromacs的基本使用
  16. 通达信公式-当天成交量不大于百日均成交量比例
  17. 【实用工具】如何录制电脑屏幕gif动图?
  18. windows android系统,手机装windows系统详细方法
  19. Windows 桌面运维 快捷键 基本配置
  20. LTCC带通滤波器设计

热门文章

  1. 华为(访问控制列表ACL)
  2. 准时下班系列_Access合集之第2集—三种方案批量上传图片到数据库,你会几种?
  3. 微信小程序—千变万化的图片处理(canvas那些滤镜效果)
  4. Android剪切板工具clipper,自动化
  5. Spark中组件Mllib的学习19之分层抽样
  6. Linux基础知识汇总,看这一篇就够了(2022最新整理)
  7. 融合实体描述与路径信息的知识图谱表示学习模型
  8. dwg在坐标转换的注意事项
  9. 来看看一个大二学生的Spark练习题
  10. iPhone OS编程指南(一)