go 服务器demo代码如下:
package main
import (
"fmt"
"log"
"net/http"
"sync"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
// 允许来自任何源的连接,或者根据你的需求设置
return true
},
}
const (
MaxConnections = 1000 //最大并发连接数;
)
var (
g_semaphore = make(chan struct{}, MaxConnections) //信号量;
g_waitGroup sync.WaitGroup //计数器;
)
func newConn(conn *websocket.Conn) {
defer g_waitGroup.Done() //计数器-1;
defer func() { <-g_semaphore }() //释放一个信号量;
//
defer conn.Close()
for {
// 读取客户端发来的消息
_, message, err := conn.ReadMessage()
if err != nil {
log.Println("read err: ", err)
break
}
fmt.Printf("received: %s\n", message)
// 发送消息给客户端
// err = conn.WriteMessage(websocket.TextMessage, []byte("Message received."))
err = conn.WriteMessage(websocket.TextMessage, message)
if err != nil {
log.Println("write err: ", err)
break
}
}
}
func handleWebSocket(wr http.ResponseWriter, req *http.Request) {
conn, err := upgrader.Upgrade(wr, req, nil)
if err != nil {
log.Println("Upgrad error :", err)
return
}
g_semaphore <- struct{}{} //+1个信号量;
g_waitGroup.Add(1) //计数器+1;
go newConn(conn)
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
fmt.Println("Starting WebSocket server on: 8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal("ListenAndServe: ", err)
}
g_waitGroup.Wait() //等待所有goroutine完成;
}
【客户端测试】
启动go服务器后,使用在线客户端测试: Websocket在线测试-Websocket接口测试-Websocket模拟请求工具
URL输出框中输入: ws://192.168.8.192:8080/ws
然后点击“Websocket连接”,其中192.168.8.192为go运行的服务器地址;
在输入框中输入消息,即可验证发送;