使用golang开发带GUI界面的TCP转发工具软件
首页 > GoLand学习   作者:皮皮华  2023年5月8日 15:39 星期一  热度:575°  字号:   评论:0 条
时间:2023-5-8 15:39   热度:575°  评论:0 条 

    在Go语言中,有几个常用的GUI库可供选择,用于创建图形用户界面(GUI)应用程序。以下是一些流行的Go GUI库:

  1. Fyne(https://fyne.io):Fyne是一个跨平台的现代化GUI库,具有简单易用的API和美观的外观。它提供了丰富的UI组件和布局选项,并支持多种操作系统和平台,包括Windows、macOS和Linux。

  2. Gio(https://gioui.org):Gio是一个跨平台的轻量级GUI库,专注于高性能和可移植性。它提供了一个基于组件的API,可在多个平台上构建快速和响应式的用户界面。

  3. Walk(https://github.com/lxn/walk):Walk是一个Windows平台特定的GUI库,适用于Windows桌面应用程序的开发。它提供了丰富的UI组件和工具,以及与Windows API的紧密集成。

  4. Lorca(https://github.com/zserge/lorca):Lorca是一个使用Go和Web技术构建跨平台桌面应用程序的库。它使用Chrome浏览器作为GUI运行时,并提供了与Go的双向通信接口。


    这里我们选择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
版权声明:若无注明,本文皆为“皮皮华博客”原创,转载请保留文章出处。

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗

评论信息框


既然没有吐槽,那就赶紧抢沙发吧!