7 Star 53 Fork 26

ryanduan/wsPool

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
client.go 2.44 KB
一键复制 编辑 原始数据 按行查看 历史
// 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.
// +build ignore
package main
import (
"flag"
"gitee.com/rczweb/wsPool"
"github.com/gogo/protobuf/proto"
"log"
"net/http"
"net/url"
"os"
"os/signal"
"time"
"github.com/gorilla/websocket"
)
var addr = flag.String("addr", "localhost:8080", "http service address")
func main() {
go wsClient("1001_1_2")
select {
}
}
func wsClient(id string) {
flag.Parse()
log.SetFlags(0)
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
u := url.URL{Scheme: "ws", Host: *addr, Path: "/ws"}
log.Printf("connecting to %s", u.String())
head := http.Header{}
log.Printf("connecting info: %s",id)
head.Add("Sec-Websocket-Protocol", id)
c, _, err := websocket.DefaultDialer.Dial(u.String(), head)
if err != nil {
log.Fatal("dial:", err)
}
defer c.Close()
ping := make(chan int)
c.SetPingHandler(func(appData string) error {
ping<-1;
return nil
})
done := make(chan struct{})
go func() {
ticker1 := time.NewTicker(10*time.Second)
defer func() {
ticker1.Stop()
close(done)
}()
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Printf("read:%s", err.Error())
return
}
log.Printf("recv: %s", message)
select{
case <-ticker1.C:
return
}
}
}()
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-done:
//重新连接
go wsClient(id)
return
case <-ticker.C:
msg:=&wsPool.SendMsg{
ToClientId:"12",
FromClientId:"13",
Msg:"test"+time.Now().String(),
Channel:[]string{"1","2"},
}
m,_:=proto.Marshal(msg)
err := c.WriteMessage(websocket.BinaryMessage, m)
if err != nil {
log.Printf("write:%s", err.Error())
return
}
case <-interrupt:
log.Printf("interrupt")
// Cleanly close the connection by sending a close message and then
// waiting (with timeout) for the server to close the connection.
err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
if err != nil {
log.Printf("write close:%s", err.Error())
return
}
select {
case <-done:
case <-time.After(time.Second):
}
return
case <-ping:
err := c.WriteMessage(websocket.PongMessage, nil)
if err != nil {
log.Printf("write pong:%s", err.Error())
return
}
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/rczweb/wsPool.git
git@gitee.com:rczweb/wsPool.git
rczweb
wsPool
wsPool
v1.4.5

搜索帮助