写点什么

实现内网穿透 (二)

作者:风斩断晚霞
  • 2022 年 5 月 26 日
  • 本文字数:953 字

    阅读完需:约 3 分钟

今天主要使用 Go 实现 echo client,并与 server 成功连接。

项目地址:https://github.com/fzdwx/burst


websocket 框架选型

使用在 Go 语言中比较流行的实现:https://github.com/gorilla/websocket

项目搭建

mkdri go && cd gogo mod init demogo 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))	}}()
复制代码
  1. 启动一个协程,读取从控制台输入的数据,然后发送到服务端。


效果



最终代码

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 }}
复制代码


明日目标

明天就正式进入具体的代码实现了。

  1. 定义交互协议(暂定为 json,主要为了快速开发)

  2. 3 个阶段

  3. 服务端与客户端连接初始化(确定客户端与服务端的端口映射关系)

  4. 客户连接,通知客户端,监听本地端口

  5. 数据转发。

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2020.09.01 加入

坚毅不导

评论

发布
暂无评论
实现内网穿透(二)_Go_风斩断晚霞_InfoQ写作社区