Skip to content
go
// Copyright 2015 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build ignore
// +build ignore

package main

import (
	"flag"
	"html/template"
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

var addr = flag.String("addr", "localhost:8080", "http service address")

// 如果是在借助一些websocket进行一些websocket的测试,需要修改 CheckOrigin,不然无法进行连接
var upgrader = websocket.Upgrader{} // use default options

// 主要的处理代码
func echo(w http.ResponseWriter, r *http.Request) {
    // 升级请求到websocket
	c, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Print("upgrade:", err)
		return
	}
    // 一定要记得关闭连接
	defer c.Close()
    // 死循环,从连接中读取消息,然后将消息写入连接
	for {
		mt, message, err := c.ReadMessage()
		if err != nil {
			log.Println("read:", err)
			break
		}
		log.Printf("recv: %s", message)
		err = c.WriteMessage(mt, message)
		if err != nil {
			log.Println("write:", err)
			break
		}
	}
}

// 当访问 / 路径时,将给出html代码解析之后,将 websocket 地址填入
func home(w http.ResponseWriter, r *http.Request) {
	homeTemplate.Execute(w, "ws://"+r.Host+"/echo")
}

func main() {
	flag.Parse()
	log.SetFlags(0)
	http.HandleFunc("/echo", echo)
	http.HandleFunc("/", home)
	log.Fatal(http.ListenAndServe(*addr, nil))
}

// 这里面是一些html代码,就不写出来了
var homeTemplate = template.Must(template.New("").Parse(``))

这段代码主要是将客户端发送过来的消息重新的发送回去