websocket
go get github.com/fast-go/websocket
service
type Auth struct {
}
func (auth *Auth)Identity(w http.ResponseWriter, r *http.Request) (error,websocket.UniqueIdentification){
return nil,"1"
}
func (auth *Auth) ConnBefore(w http.ResponseWriter, r *http.Request) {
}
func (auth *Auth)ConnDone(c *websocket.Connection) {
}
func (auth *Auth)Heartbeat(c *websocket.Connection) {
ticker := time.NewTicker(time.Second * 2)
for {
<-ticker.C
if err := c.WriteMessage([]byte("ping"));err != nil {
return
}
}
}
func TestSocket(t *testing.T) {
im := websocket.NewWebSocket()
im.Events.Register("enter", func(s *websocket.Subject) {
_ = s.Send([]byte("Send to yourself"))
s.IsOnline("1")
_ = s.SendToUid("1",[]byte("Send to others"))
s.Broadcast([]byte("broadcast"))
})
im.Events.Register("group_send", func(s *websocket.Subject) {
im.Manager.Broadcast(s.Conn,[]byte("This is group send message"))
})
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
im.Middleware(writer,request,&Auth{})
})
err := http.ListenAndServe(":9090", nil)
if err != nil {
fmt.Print(err)
}
}
client
Local test, sending one million requests, about 1m34.139s
import (
"fmt"
"golang.org/x/net/websocket"
"net/url"
"strconv"
"testing"
"time"
)
type Client struct {
Host string
Path string
Conn *websocket.Conn
}
func NewWebsocketClient(host, path string) *Client {
u := url.URL{Scheme: "ws", Host: host, Path: path}
ws, err := websocket.Dial(u.String(), "", "http://"+host+"/")
fmt.Println(err)
return &Client{
Host: host,
Path: path,
Conn:ws,
}
}
func (this *Client) SendMessage(body []byte) error {
_, err := this.Conn.Write(body)
if err != nil {
return err
}
return nil
}
func TestClient(t *testing.T) {
client := NewWebsocketClient("localhost:9090","/")
t1 := time.Now()
for i := 0 ;i < 1000000;i++ {
_ = client.SendMessage([]byte(`{"route":"test","data":"`+strconv.Itoa(i + 1)+`"}`))
}
elapsed := time.Since(t1)
fmt.Println(elapsed)
time.Sleep(time.Second * 100)
}
client send data format
{"event":"enter","data":"hello world"}