golang实现websocket

1.需要的websocket的包:   "github.com/gorilla/websocket"
package main

import (
	"github.com/gorilla/websocket"
	"learngo/websocket/impl"
	"net/http"
	"time"
)

var(
	upgrader = websocket.Upgrader{
		//允许跨域访问
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	}
)

func wsHandler(w http.ResponseWriter, r *http.Request) {
	//w.Write([]byte("hello"))
	//收到http请求(upgrade),完成websocket协议转换
	//在应答的header中放上upgrade:websoket
	var (
		wsConn *websocket.Conn
		err error
		data []byte
		conn *impl.Connection
	)
	//Upgrade websocket(返回给客户端的消息)
	if wsConn, err = upgrader.Upgrade(w, r, nil); err !=nil {
		//报错了,直接返回底层的websocket链接就会终断掉
		return
	}
	if conn, err = impl.InitConnection(wsConn); err != nil {
		goto ERR
	}

	//心跳
	go func() {
		var(
			err error
		)
		for {
			if err = conn.WriteMessage([]byte("heatbeat")); err != nil {
				return
			}
			time.Sleep(5*time.Second)
		}

	}()

	for {
		if data, err = conn.ReadMessage(); err != nil {
			goto ERR
		}
		if err = conn.WriteMessage(data); err != nil {
			goto ERR
		}
	}
ERR:
	conn.Close()
}

func userHandler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World!"))
}

func main() {
	//http://localhost:7777/ws
	http.HandleFunc("/ws", wsHandler)
	http.HandleFunc("/user", userHandler)
	//服务端启动
	http.ListenAndServe("0.0.0.0:7777", nil)
}

 

实现模块:线程安全

package main

import (
	"github.com/gorilla/websocket"
	"net/http"
)

var(
	upgrader = websocket.Upgrader{
		//允许跨域访问
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	}
)

func wsHandler(w http.ResponseWriter, r *http.Request) {
	//w.Write([]byte("hello"))
	//收到http请求(upgrade),完成websocket协议转换
	//在应答的header中放上upgrade:websoket
	var (
		conn *websocket.Conn
		err error
		//msgType int
		data []byte
	)
	if conn, err = upgrader.Upgrade(w, r, nil); err !=nil {
		//报错了,直接返回底层的websocket链接就会终断掉
		return
	}
	//得到了websocket.Conn长连接的对象,实现数据的收发
	for {
		//Text(json), Binary
		//if _, data, err = conn.ReadMessage(); err != nil {
		if _, data, err = conn.ReadMessage(); err != nil {
			//报错关闭websocket
			goto ERR
		}
		//发送数据,判断返回值是否报错
		if err = conn.WriteMessage(websocket.TextMessage, data); err != nil {
			//报错了
			goto ERR
		}
	}
//error的标签
ERR:
	conn.Close()
}

func helloHandler(w http.ResponseWriter, r *http.Request){
	w.Write([]byte("Hello World!"))
}

func main() {
	//http://localhost:7777/ws
	http.HandleFunc("/ws", wsHandler)
	http.HandleFunc("/hello", helloHandler)
	//服务端启动
	http.ListenAndServe("0.0.0.0:7777", nil)
}

 js文件:

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script>
        window.addEventListener("load", function(evt) {
            var output = document.getElementById("output");
            var input = document.getElementById("input");
            var ws;
            var print = function(message) {
                var d = document.createElement("div");
                d.innerHTML = message;
                output.appendChild(d);
            };
            document.getElementById("open").onclick = function(evt) {
                if (ws) {
                    return false;
                }
                ws = new WebSocket("ws://192.168.230.130:7777/ws");
                ws.onopen = function(evt) {
                    print("OPEN");
                }
                ws.onclose = function(evt) {
                    print("CLOSE");
                    ws = null;
                }
                ws.onmessage = function(evt) {
                    print("RESPONSE: " + evt.data);
                }
                ws.onerror = function(evt) {
                    print("ERROR: " + evt.data);
                }
                return false;
            };
            document.getElementById("send").onclick = function(evt) {
                if (!ws) {
                    return false;
                }
                print("SEND: " + input.value);
                ws.send(input.value);
                return false;
            };
            document.getElementById("close").onclick = function(evt) {
                if (!ws) {
                    return false;
                }
                ws.close();
                return false;
            };
        });
    </script>
</head>
<body>
<table>
    <tr><td valign="top" width="50%">
        <p>Click "Open" to create a connection to the server,
            "Send" to send a message to the server and "Close" to close the connection.
            You can change the message and send multiple times.
        </p>
            <form>
                <button id="open">Open</button>
                <button id="close">Close</button>
            <input id="input" type="text" value="Hello world!">
            <button id="send">Send</button>
            </form>
    </td><td valign="top" width="50%">
        <div id="output"></div>
    </td></tr></table>
</body>
</html>

  

  

原文地址:https://www.cnblogs.com/xingyunshizhe/p/11225135.html

时间: 2024-11-05 09:17:18

golang实现websocket的相关文章

golang之websocket 源码分析

下载go的websocket包. 1. 通过google官方的方法, 需要hg来同步代码. 由于墙的原因, 还需要设置代理. 比较麻烦 2. http://gopm.io/ 通过该网站下载, 这是golang中国提供的解决方法 http://www.golangtc.com/download/package websocket的实现还是比较简单的. 一共就4个文件. client.go  hybi.go server.go websocket.go 示例代码网上到处都是, 就不贴了. 有一篇自己

golang gorilla websocket例子

WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范. 在golang语言中,目前有两种比较常用的实现方式:一个是golang自带的库,另一个是gorilla,功能强大. golang自带库的使用例子可参考以前的博文:Golang如何使用websocket 本文以gorilla为例,介绍websoc

使用golang开发websocket的记录

使用beego框架进行整个社区的restful api的开发,查找资料后决定使用github.com/gorilla/websocket  作为websocket的包, 定义websocket的属性 var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } 都是按照官方的例子来,期间也参考了beego的一个聊天室的实例. ws, err := upgrader.Upgrade(this.Ct

golang(5):编写WebSocket服务,client和html5调用

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处! 1.关于websocket HTML5定义了WebSocket协议,能更好的节省server资源和带宽并达到实时通讯. 在JavaEE7中也实现了WebSocket协议. 在 WebSocket API,浏览器和server仅仅须要要做一个握手的动作.然后,浏览器和server之间就形成了一条高速通道. 两者之间就直接能够数据互相传送. 參考

golang(5):编写WebSocket服务,客户端和html5调用

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处! 1,关于websocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯. 在JavaEE7中也实现了WebSocket协议. 在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送. 参考: http://ba

Golang如何使用websocket

下载websocket包 $ go get golang.org/x/net/websocket 如果下载失败,可能是被墙了. package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket" (https fetch: Get https://golang.org/x/net/websocket?go-get=1: dial tcp 216.239.37.1:443: c

WebSocket 和 Golang 实现聊天功能

本文同步至 http://www.waylau.com/go-websocket-chat/ 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery 创建一个简单的web聊天应用程序.这个示例的源代码在 https://github.com/waylau/goChat . Running the example 运行示例 这个示例需要 Golang 开发环境. 该页面描述如何安装开发环境. 一旦你去启动和运行,您可以下载.构建和运行的例子, 使用命令: go get

golang iris下面的websocket

最近要做后台主动推送:(iris框架,封装的有wesocket,刚开始以为直接拿过来用,结果不是现在贴一下代码,写一下遇到的坑) func main() {    app := iris.New()    app.Adapt(iris.DevLogger())    app.Adapt(httprouter.New())    //创建websocket服务器    ws := websocket.New(websocket.Config{        Endpoint: "/pushmess

golang websocket

WebSocket协议分析 内容不断更新,目前包括协议中握手和数据帧的分析 1.1 背景 1.2 协议概览 协议包含两部分:握手,数据传输. 客户端的握手如下:GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Origin: http://example.comSec-WebSocket-Protocol