golang网络编程学习-websocket

这篇具有很好参考价值的文章主要介绍了golang网络编程学习-websocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

golang网络编程学习-websocket

网络编程主要的内容是:
1.TCP网络编程
2.http服务
3.rpc服务
4.websocket服务

 一、websocket编程

1.1服务端,代码来自网络,仅限于学习研究

package main

import (
	"fmt"
	"net/http"
	"os"
	"reflect"
	"time"
	"unsafe"

	"github.com/gorilla/websocket"
)

type HttpHandler struct {
	http.Handler
}

func main() {
	var httpHandler HttpHandler
	http.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.C
			fmt.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))
}

 文章来源地址https://www.toymoban.com/news/detail-583645.html

服务端截图

golang网络编程学习-websocket,golang30天,golang,学习,websocket

 

1.2客户端,代码来自网络,仅限于学习研究

<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://127.0.0.1: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,golang30天,golang,学习,websocket

 

golang网络编程学习-websocket,golang30天,golang,学习,websocket

 

 客户端浏览器运行内容信息

 golang网络编程学习-websocket,golang30天,golang,学习,websocket

 

到了这里,关于golang网络编程学习-websocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go语言网络编程(socket编程)WebSocket编程

    WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输 需要安装第

    2024年02月09日
    浏览(77)
  • python网络编程之websocket

    我们知道一般我们的请求都是http请求,由客户端发起,然后待服务端返回数据之后,这一个请求就结束了。但是,有些情况下,服务端需要主动给客户端发消息(比如推送一些消息),服务端与客户端需要进行双向交流,此时,http就显得有些无能为力了。所以就有了全双工

    2024年02月10日
    浏览(41)
  • Java网络Socket编程-websocket

    实现一个用于监测 WebSocket 连接状态的线程类,其作用是通过创建一个 WebSocket 客户端,连接到指定的 WebSocket 地址,并监测连接的状态。 代码中的 WebSocketThread 类继承自 Thread ,意味着它可以在单独的线程中执行。该线程类使用 Tyrus 提供的 @ClientEndpoint 注解来标识这是一个

    2024年02月08日
    浏览(50)
  • Go语言网络编程入门:TCP、HTTP、JSON序列化、Gin、WebSocket、RPC、gRPC示例

    在本文中,我们将介绍Go语言中的网络编程的不同方式,包括TCP、HTTP、Gin框架、WebSocket、RPC、gRPC的介绍与连接实例,并对所有示例代码都给出了详细的注释,最后对每种模式进行了总结。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,提供

    2024年02月16日
    浏览(59)
  • 学习网络编程No.4【socket编程实战】

    北京时间:2023/8/19/23:01,耍了好几天,主要归咎于《我欲封天》这本小说,听了几个晚上之后逐渐入门,在闲暇时间又看了一下,小高潮直接来临,最终在三个昼夜下追完了,哈哈哈!没办法呀,哎!末200章有些些烂尾,结局合乎情理,总的来说优秀,毕竟耳根的名号摆在哪

    2024年02月11日
    浏览(45)
  • 学习网络编程No.1【网络基础知识】

    北京时间:2023/8/4/22:40,天苍苍野茫茫,风吹造地见牛羊,此时心潮澎湃,非常开心,啊哈哈哈!因为就在刚刚我们终于把系统编程方面的知识给学完了,啊哈哈哈!真是功夫不负有心人呀!呜呜呜,仰天而泣,算了,不能发神经,哈哈!今天把最后一节有关多线程知识的课

    2024年02月14日
    浏览(57)
  • 【Java学习笔记】 68 - 网络——TCP编程、UDP编程

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter21/src 目录 项目代码 网络 一、网络相关概念 1.网络通讯 2.网络 3.IP地址 4.域名 5.端口号 6.网络通讯协议 TCP协议:传输控制协议 UDP协议: 二、InetAddress类 1.相关方法 三、Socket 1.基本介绍 2.TCP网络通信编程 基本介绍 应用案例

    2024年02月04日
    浏览(53)
  • Java基础学习(17)网络编程

    解释: 在网络通信协议下,不同计算机上运行的程序,进行的数据传输 应用场景 : 即时通信、网游对战、金融证券、国际贸易、邮件、等等 不管是什么场景,都是计算机跟计算机之间通过网络进行 数据传输 Java中可以使用 java.net 包下的技术轻松开发出常见的网络应用程序

    2024年02月05日
    浏览(75)
  • 4.14日网络编程学习

    IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。 要想使网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机或者发送数据的计算机。 在TCP/IP协议中,这个标识号就是IP地址,它可以唯一标识一台计算机,目

    2024年04月15日
    浏览(37)
  • 学习网络编程No.10【深入学习HTTPS】

    北京时间:2023/11/14/18:45,因为种种原因,上个月的文章昨天才更新,目前处于刷题前夕,算法课在看了。这次和以前不一样,因为以前对知识框架没有很好的理念,并不清楚相关知识要学到什么时候才算完,大部分时间都花在了总结博客中,而这次我们已经将主线课程全部学

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包