使用golang开发带GUI界面的TCP转发工具软件
时间:2023-5-8 15:39
热度:1389°
评论:0 条
在Go语言中,有几个常用的GUI库可供选择,用于创建图形用户界面(GUI)应用程序。以下是一些流行的Go GUI库:
-
Gio(https://gioui.org):Gio是一个跨平台的轻量级GUI库,专注于高性能和可移植性。它提供了一个基于组件的API,可在多个平台上构建快速和响应式的用户界面。
-
Walk(https://github.com/lxn/walk):Walk是一个Windows平台特定的GUI库,适用于Windows桌面应用程序的开发。它提供了丰富的UI组件和工具,以及与Windows API的紧密集成。
这里我们选择Fyne库,使用golang制作TCP转发小工具。在开始前我们需要安装MSYS2,这是一个用于 Windows 的软件发行版,它提供了一个类似于 Linux 的开发环境,使得在 Windows 上进行类 Unix 软件的开发更加便捷。在https://www.msys2.org/下载。安装好后执行下列指令安撞相关的环境,并添加环境变量。
pacman -Syu # 更新 MSYS2 并获取最新的软件包数据库 pacman -S mingw-w64-x86_64-gcc # 64 位系统 pacman -S mingw-w64-x86_64-glib2 # 64 位系统 pacman -S mingw-w64-x86_64-cairo # 64 位系统 pacman -S mingw-w64-x86_64-pango # 64 位系统 pacman -S mingw-w64-x86_64-gtk3 # 64 位系统 添加PATH环境变量C:\msys64\mingw64\bin上移至第一行 新建PKG_CONFIG_PATH变量C:\msys64\mingw64\lib\pkgconfig在golang中终端命令行中执行go get fyne.io/fyne/v2下载fyne库
新建一个main.go文件,工具源码如下
package main import ( "fmt" "io" "log" "net" "os" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) //go build -ldflags "-H=windowsgui" main.go #禁用调试信息和符号表并隐藏执行时的黑色窗口 //go get fyne.io/fyne/v2 func main() { // 创建 Fyne 应用程序 myApp := app.New() window := myApp.NewWindow("转发工具") window.Resize(fyne.NewSize(400, 300)) // 创建输入框 ipEntry := widget.NewEntry() portEntry := widget.NewEntry() destIPEntry := widget.NewEntry() destPortEntry := widget.NewEntry() // 获取本机IP地址并显示在输入框 addrs, err := net.InterfaceAddrs() if err != nil { fmt.Println(err) os.Exit(1) } for _, addr := range addrs { if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { if ipNet.IP.To4() != nil { ipEntry.SetText(ipNet.IP.String()) break } } } // 创建转发按钮 forwardButton := widget.NewButton("Start", func() { // 获取输入框中的数值 ip := ipEntry.Text port := portEntry.Text destIP := destIPEntry.Text destPort := destPortEntry.Text // 执行转发操作 go forwardTCP(ip, port, destIP, destPort) //go forwardUDP(ip, port, destIP, destPort) //go forwardSSL(ip, port, destIP, destPort) }) // 创建布局 content := container.NewVBox( widget.NewLabel("ip:"), ipEntry, widget.NewLabel("port:"), portEntry, widget.NewLabel("destIP:"), destIPEntry, widget.NewLabel("destPort:"), destPortEntry, forwardButton, ) // 将布局添加到窗口中 window.SetContent(content) window.ShowAndRun() } // TCP转发函数 func forwardTCP(ip, port, destIP, destPort string) { ln, err := net.Listen("tcp", ip+":"+port) if err != nil { log.Fatal(err) } for { conn, err := ln.Accept() if err != nil { log.Fatal(err) } go func() { defer conn.Close() remoteConn, err := net.Dial("tcp", destIP+":"+destPort) if err != nil { log.Fatal(err) } defer remoteConn.Close() io.Copy(conn, remoteConn) }() } fmt.Println("执行TCP转发操作") } // UDP转发函数 func forwardUDP(ip, port, destIP, destPort string) { udpAddr, err := net.ResolveUDPAddr("udp", ip+":"+port) if err != nil { log.Fatal(err) } conn, err := net.ListenUDP("udp", udpAddr) if err != nil { log.Fatal(err) } for { buf := make([]byte, 1024) n, _, err := conn.ReadFromUDP(buf) if err != nil { log.Fatal(err) } go func() { remoteAddr, err := net.ResolveUDPAddr("udp", destIP+":"+destPort) if err != nil { log.Fatal(err) } remoteConn, err := net.DialUDP("udp", nil, remoteAddr) if err != nil { log.Fatal(err) } defer remoteConn.Close() _, err = remoteConn.Write(buf[:n]) if err != nil { log.Fatal(err) } }() } fmt.Println("执行UDP转发操作") } // SSL转发函数 func forwardSSL(ip, port, destIP, destPort string) { // 在此处实现SSL转发逻辑 // 使用 `ip` 和 `port` 进行监听并将传入的SSL连接转发到 `destIP` 和 `destPort` fmt.Println("执行SSL转发操作") }
最后使用以下指令编译
go build -ldflags "-H=windowsgui" main.go
软件界面如下所示
捐赠支持:如果觉得这篇文章对您有帮助,请“扫一扫”鼓励作者!
本文无需标签!
本文作者:皮皮华
文章标题: 使用golang开发带GUI界面的TCP转发工具软件
本文地址:http://huazai.eleuu.com/?post=65
版权声明:若无注明,本文皆为“皮皮华博客”原创,转载请保留文章出处。
本文地址:http://huazai.eleuu.com/?post=65
版权声明:若无注明,本文皆为“皮皮华博客”原创,转载请保留文章出处。
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!