参考
https://github.com/ukai/go-websocket-sample/blob/master/websocket_echo_sample.go
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.2.md
WebSocket是HTML5的重要特性,它实现了基于浏览器的远程socket,它使浏览器和服务器可以进行全双工通信,许多浏览器(Firefox、Google Chrome和Safari)都已对此做了支持。
WebSocket采用了一些特殊的报头,使得浏览器和服务器只需要做一个握手的动作,就可以在浏览器和服务器之间建立一条连接通道。且此连接会保持在活动状态,它解决了Web实时化的问题,Websocket服务端可以推送(push)数据到web客户端。
WebSocket URL的起始输入是ws://或是wss://(在SSL上)。下图展示了WebSocket的通信过程,一个带有特定报头的HTTP握手被发送到了服务器端,接着在服务器端或是客户端就可以通过JavaScript来使用某种套接口(socket),这一套接口可被用来通过事件句柄异步地接收数据。
示例1
对参考进行了简洁化和优化,自己写了测试代码,浏览器演示如下
服务端
package main
import (
"fmt"
"golang.org/x/net/websocket"
"html/template"
"io"
"log"
"net/http"
)
func Copy(ws *websocket.Conn) {
fmt.Printf("copyServer %#v\n", ws.Config())
io.Copy(ws, ws) //websocket.Conn实现了Read()和Write(),所以可以直接Copy。此时会阻塞并不断复制返回接收到的内容
fmt.Println("copyServer finished")
}
func ReadWrite(ws *websocket.Conn) {
fmt.Printf("readWriteServer %#v\n", ws.Config())
buf := make([]byte, 100)
for {
n, err := ws.Read(bu