项目地址:https://github.com/fzdwx/burst
今天主要使用Go实现 echo client
,并与server成功连接。
websocket框架选型
使用在Go语言中比较流行的实现:https://github.com/gorilla/websocket
项目搭建
mkdri go && cd go
go mod init demo
go get github.com/gorilla/websocket
与客户端建立连接
func main() {
// 定义客户端的地址
u := url.URL{Scheme: "ws", Host: "locaalhost:999", Path: "/connect"}
// 与客户端建立连接
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer c.Close()
// 启动一个协程,读取从服务端发送过来的数据
go func() {
for {
_, message, _ := c.ReadMessage()
fmt.Println(string(message))
}
}()
// 阻塞主线程
down := make(chan byte)
for {
<-down
}
}
启动客户端
成功接收到来自服务端的消息。
实现echo handle
只需要我们从客户端发送消息就ok了,然后服务端就会把我们发送的数据返回给我们。
go func() {
for {
var input string
fmt.Scanln(&input)
c.WriteMessage(websocket.TextMessage, []byte(input))
}
}()
- 启动一个协程,读取从控制台输入的数据,然后发送到服务端。
效果
最终代码
package main
import (
"flag"
"fmt"
"github.com/gorilla/websocket"
"log"
"net/url"
)
var addr = flag.String("addr", "localhost:9999", "proxy server addr")
func main() {
u := url.URL{Scheme: "ws", Host: *addr, Path: "/connect"}
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer c.Close()
down := make(chan byte)
go func() {
for {
_, message, _ := c.ReadMessage()
fmt.Println("服务端发送:" + string(message))
}
}()
go func() {
for {
var input string
fmt.Scanln(&input)
c.WriteMessage(websocket.TextMessage, []byte(input))
}
}()
for {
<-down
}
}
明日目标
明天就正式进入具体的代码实现了。
- 定义交互协议(暂定为json,主要为了快速开发)
3个阶段
- 服务端与客户端连接初始化(确定客户端与服务端的端口映射关系)
- 客户连接,通知客户端,监听本地端口
- 数据转发。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。