项目地址:https://github.com/fzdwx/burst今天主要用Go实现echo客户端,成功连接服务器。websocket框架选择使用Go语言中流行的实现:https://github.com/gorilla/websocketprojectbuildsmkdrigo&&cdgogomodinitdemogogetgithub.com/gorilla/websocket与客户端建立连接funcmain(){//定义客户端地址u:=url.URL{Scheme:"ws",Host:"localhost:999",Path:"/connect"}//与客户端建立连接c,_,err:=websocket.DefaultDialer.Dial(u.String(),nil)iferr!=nil{log.Fatal("dial:",err)}deferc.Close()//启动协程读取service终端发送的数据gofunc(){for{_,message,_:=c.ReadMessage()fmt.Println(string(message))}}()//阻塞主线程:=make(chanbyte)for{<-down}}启动客户端成功接收来自服务器的消息。实现回显句柄,我们只需要从客户端发送一条消息,然后服务器就会返回我们发送给我们的数据。gofunc(){for{varinputstringfmt.Scanln(&input)c.WriteMessage(websocket.TextMessage,[]byte(input))}}()启动一个协程,从控制台读取数据输入,然后发送到服务器。效果最终代码包mainimport("flag""fmt""github.com/gorilla/websocket""log""net/url")varaddr=flag.String("addr","localhost:9999","proxyserveraddr")funcmain(){u:=url.URL{Scheme:"ws",Host:*addr,Path:"/connect"}c,_,err:=websocket.DefaultDialer.Dial(u.String(),nil)iferr!=nil{log.Fatal("dial:",err)}deferc.Close()down:=make(chanbyte)gofunc(){for{_,message,_:=c.ReadMessage()fmt.Println("Sentbytheserver:"+string(message))}}()gofunc(){for{varinputstringfmt.Scanln(&input)c.WriteMessage(websocket.TextMessage,[]byte(input))}}()for{<-down}}明天的目标明天正式进入具体代码实现。分三个阶段定义交互协议(暂定为json,主要为了快速开发):server-client连接初始化(确定client和server之间的端口映射关系)client连接,通知client,监听本地端口数据转发。
