forked from go/golangs_learn
VIVIMAN
3 years ago
8 changed files with 355 additions and 0 deletions
@ -0,0 +1,35 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"bufio" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"log" |
||||
|
"net" |
||||
|
) |
||||
|
|
||||
|
func handleConnection(conn net.Conn) { |
||||
|
br := bufio.NewReader(conn) |
||||
|
for { |
||||
|
data, err := br.ReadString('\n') |
||||
|
if err == io.EOF { |
||||
|
break |
||||
|
} |
||||
|
fmt.Printf("%s", data) |
||||
|
fmt.Fprintf(conn, "OK\n") |
||||
|
} |
||||
|
conn.Close() |
||||
|
} |
||||
|
func main() { |
||||
|
ln, err := net.Listen("tcp", ":54022") |
||||
|
if err != nil { |
||||
|
panic(err) |
||||
|
} |
||||
|
for { |
||||
|
conn, err := ln.Accept() |
||||
|
if err != nil { |
||||
|
log.Fatal("get client connection error: ", err) |
||||
|
} |
||||
|
go handleConnection(conn) |
||||
|
} |
||||
|
} |
@ -0,0 +1,53 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"net" |
||||
|
"os" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
// 获取IP和端口
|
||||
|
func getIpPort() []string { |
||||
|
// 根据接收参数个数,定义动态数组,
|
||||
|
ipPorts := make([]string, len(os.Args)-1) |
||||
|
i := 0 |
||||
|
for index, value := range os.Args { |
||||
|
//排除脚本名称
|
||||
|
if index == 0 { |
||||
|
continue |
||||
|
} |
||||
|
//写入数组
|
||||
|
ipPorts[i] = value |
||||
|
i++ |
||||
|
} |
||||
|
return ipPorts |
||||
|
} |
||||
|
|
||||
|
// 检测端口
|
||||
|
func checkPorts(ipPorts []string) { |
||||
|
now := time.Now().Format("2006-01-02 15:04:05") |
||||
|
for _, ipPort := range ipPorts { |
||||
|
// 检测端口
|
||||
|
conn, err := net.DialTimeout("tcp", ipPort, 3*time.Second) |
||||
|
if err != nil { |
||||
|
fmt.Println("["+now+"]", ipPort, "端口未开启(fail)!") |
||||
|
} else { |
||||
|
if conn != nil { |
||||
|
fmt.Println("["+now+"]", ipPort, "端口已开启(success)!") |
||||
|
conn.Close() |
||||
|
} else { |
||||
|
fmt.Println("["+now+"]", ipPort, "端口未开启(fail)!") |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func main() { |
||||
|
|
||||
|
ret := getIpPort() |
||||
|
if len(ret) == 0 { |
||||
|
ret = []string{":35017", ":54022"} |
||||
|
} |
||||
|
checkPorts(ret) |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
set GO111MODULE=on |
||||
|
set GOARCH=386 |
||||
|
rsrc -manifest main.manifest -ico main.ico -o main.syso |
||||
|
go generate |
||||
|
go build -ldflags="-s -w -H=windowsgui" -o 꽉데으-頓契솰왠.exe |
@ -0,0 +1,225 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"log" |
||||
|
"net" |
||||
|
"os/exec" |
||||
|
"runtime" |
||||
|
"syscall" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/braintree/manners" |
||||
|
"github.com/lxn/walk" |
||||
|
) |
||||
|
|
||||
|
type MyWindow struct { |
||||
|
*walk.MainWindow |
||||
|
ni *walk.NotifyIcon |
||||
|
} |
||||
|
|
||||
|
func NewMyWindow() *MyWindow { |
||||
|
mw := new(MyWindow) |
||||
|
var err error |
||||
|
mw.MainWindow, err = walk.NewMainWindow() |
||||
|
checkError(err) |
||||
|
return mw |
||||
|
} |
||||
|
|
||||
|
func (mw *MyWindow) AddNotifyIcon() { |
||||
|
var err error |
||||
|
mw.ni, err = walk.NewNotifyIcon(mw) |
||||
|
checkError(err) |
||||
|
_ = mw.ni.SetVisible(true) |
||||
|
|
||||
|
icon, err := walk.NewIconFromResourceId(3) |
||||
|
checkError(err) |
||||
|
_ = mw.SetIcon(icon) |
||||
|
_ = mw.ni.SetIcon(icon) |
||||
|
|
||||
|
// 数据库 服务
|
||||
|
mw.addDbMenu() |
||||
|
|
||||
|
// 应用程序 服务
|
||||
|
mw.addCxMenu() |
||||
|
|
||||
|
// 其他快捷键
|
||||
|
mw.addOther() |
||||
|
|
||||
|
} |
||||
|
|
||||
|
func init() { |
||||
|
|
||||
|
} |
||||
|
func main() { |
||||
|
mw := NewMyWindow() |
||||
|
|
||||
|
mw.AddNotifyIcon() |
||||
|
mw.Run() |
||||
|
} |
||||
|
|
||||
|
func checkError(err error) { |
||||
|
if err != nil { |
||||
|
log.Fatal(err) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// open opens the specified URL in the default browser of the user.
|
||||
|
func OpenUrl(url string) error { |
||||
|
var cmd string |
||||
|
var args []string |
||||
|
|
||||
|
switch runtime.GOOS { |
||||
|
case "windows": |
||||
|
cmd = "cmd" |
||||
|
args = []string{"/c", "start"} |
||||
|
case "darwin": |
||||
|
cmd = "open" |
||||
|
default: // "linux", "freebsd", "openbsd", "netbsd"
|
||||
|
cmd = "xdg-open" |
||||
|
} |
||||
|
args = append(args, url) |
||||
|
c := exec.Command(cmd, args...) |
||||
|
c.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} |
||||
|
return c.Start() |
||||
|
} |
||||
|
|
||||
|
// addOther 增加其他按钮操作
|
||||
|
func (mw *MyWindow) addOther() { |
||||
|
mw.addAction(nil, "打开应用").Triggered().Attach(func() { |
||||
|
_ = OpenUrl("http://localhost:54022/qggwy") |
||||
|
}) |
||||
|
|
||||
|
helpMenu := mw.addMenu("帮助") |
||||
|
mw.addAction(helpMenu, "升级").Triggered().Attach(func() { |
||||
|
walk.MsgBox(mw, "即将打开网页", "点击《确认》进行下载安装组工软件!", walk.MsgBoxIconInformation) |
||||
|
_ = OpenUrl("https://www.12371.cn/zgrjxz/gwywx/") |
||||
|
}) |
||||
|
|
||||
|
mw.addAction(helpMenu, "关于").Triggered().Attach(func() { |
||||
|
walk.MsgBox(mw, "关于", "辅助使用公务员系统服务", walk.MsgBoxIconInformation) |
||||
|
}) |
||||
|
|
||||
|
mw.addAction(nil, "退出").Triggered().Attach(func() { |
||||
|
mw.ni.Dispose() |
||||
|
mw.Dispose() |
||||
|
walk.App().Exit(0) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// addDbMenu 增加数据库服务按钮操作
|
||||
|
func (mw *MyWindow) addDbMenu() { |
||||
|
dbMenu := mw.addMenu("数据服务") |
||||
|
startDbAction := mw.addAction(dbMenu, "启动") |
||||
|
stopDbAction := mw.addAction(dbMenu, "停止") |
||||
|
|
||||
|
_ = stopDbAction.SetEnabled(false) |
||||
|
startDbAction.Triggered().Attach(func() { |
||||
|
ok := manners.Close() |
||||
|
if !ok { |
||||
|
setEnableAndCheck(startDbAction, stopDbAction, true, false) |
||||
|
mw.msgbox("启动", "启动失败!", walk.MsgBoxIconError) |
||||
|
} else { |
||||
|
setEnableAndCheck(startDbAction, stopDbAction, false, true) |
||||
|
mw.msgbox("启动", "启动成功.", walk.MsgBoxIconInformation) |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
stopDbAction.Triggered().Attach(func() { |
||||
|
ok := manners.Close() |
||||
|
if !ok { |
||||
|
setEnableAndCheck(startDbAction, stopDbAction, false, true) |
||||
|
mw.msgbox("停止", "停止失败!", walk.MsgBoxIconError) |
||||
|
} else { |
||||
|
setEnableAndCheck(startDbAction, stopDbAction, true, false) |
||||
|
mw.msgbox("停止", "停止成功.", walk.MsgBoxIconInformation) |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
go AddListen(startDbAction, stopDbAction, ":35017", 3*time.Second) |
||||
|
} |
||||
|
|
||||
|
// addCxMenu 增加程序服务按钮操作
|
||||
|
func (mw *MyWindow) addCxMenu() { |
||||
|
cxMenu := mw.addMenu("应用服务") |
||||
|
startCxAction := mw.addAction(cxMenu, "启动") |
||||
|
stopCxAction := mw.addAction(cxMenu, "停止") |
||||
|
_ = stopCxAction.SetEnabled(false) |
||||
|
startCxAction.Triggered().Attach(func() { |
||||
|
ok := manners.Close() |
||||
|
if !ok { |
||||
|
setEnableAndCheck(startCxAction, stopCxAction, true, false) |
||||
|
mw.msgbox("启动", "启动失败!", walk.MsgBoxIconError) |
||||
|
} else { |
||||
|
setEnableAndCheck(startCxAction, stopCxAction, false, true) |
||||
|
mw.msgbox("启动", "启动成功.", walk.MsgBoxIconInformation) |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
stopCxAction.Triggered().Attach(func() { |
||||
|
ok := manners.Close() |
||||
|
if ok { |
||||
|
setEnableAndCheck(startCxAction, stopCxAction, false, true) |
||||
|
mw.msgbox("停止", "停止失败!", walk.MsgBoxIconError) |
||||
|
} else { |
||||
|
setEnableAndCheck(startCxAction, stopCxAction, true, false) |
||||
|
mw.msgbox("停止", "停止成功.", walk.MsgBoxIconInformation) |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
go AddListen(startCxAction, stopCxAction, ":54022", 3*time.Second) |
||||
|
} |
||||
|
|
||||
|
// AddListen 增加服务监听,控制按钮状态
|
||||
|
func AddListen(startAction *walk.Action, stopAction *walk.Action, address string, timeout time.Duration) { |
||||
|
conn, err := net.DialTimeout("tcp", address, timeout) |
||||
|
if err != nil { |
||||
|
// fmt.Println("["+now+"]", ipPort, "端口未开启(fail)!")
|
||||
|
setEnableAndCheck(startAction, stopAction, false, false) |
||||
|
} else { |
||||
|
if conn != nil { |
||||
|
// fmt.Println("["+now+"]", ipPort, "端口已开启(success)!")
|
||||
|
setEnableAndCheck(startAction, stopAction, false, true) |
||||
|
_ = conn.Close() |
||||
|
} else { |
||||
|
// fmt.Println("["+now+"]", ipPort, "端口未开启(fail)!")
|
||||
|
setEnableAndCheck(startAction, stopAction, true, false) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// setEnableAndCheck 设置按钮状态
|
||||
|
func setEnableAndCheck(startAction, stopAction *walk.Action, startBool, stopBool bool) { |
||||
|
_ = startAction.SetEnabled(startBool) |
||||
|
_ = stopAction.SetEnabled(stopBool) |
||||
|
_ = startAction.SetChecked(!startBool) |
||||
|
_ = stopAction.SetChecked(!stopBool) |
||||
|
} |
||||
|
|
||||
|
// addMenu 增加分类按钮操作
|
||||
|
func (mw *MyWindow) addMenu(name string) *walk.Menu { |
||||
|
helpMenu, err := walk.NewMenu() |
||||
|
checkError(err) |
||||
|
help, err := mw.ni.ContextMenu().Actions().AddMenu(helpMenu) |
||||
|
checkError(err) |
||||
|
_ = help.SetText(name) |
||||
|
|
||||
|
return helpMenu |
||||
|
} |
||||
|
|
||||
|
// addAction 增加分类子按钮操作
|
||||
|
func (mw *MyWindow) addAction(menu *walk.Menu, name string) *walk.Action { |
||||
|
action := walk.NewAction() |
||||
|
_ = action.SetText(name) |
||||
|
if menu != nil { |
||||
|
_ = menu.Actions().Add(action) |
||||
|
} else { |
||||
|
_ = mw.ni.ContextMenu().Actions().Add(action) |
||||
|
} |
||||
|
return action |
||||
|
} |
||||
|
|
||||
|
// msgbox 提示框
|
||||
|
func (mw *MyWindow) msgbox(title, message string, style walk.MsgBoxStyle) { |
||||
|
_ = mw.ni.ShowInfo(title, message) |
||||
|
walk.MsgBox(mw, title, message, style) |
||||
|
} |
After Width: | Height: | Size: 6.3 KiB |
@ -0,0 +1,22 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> |
||||
|
<assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/> |
||||
|
<dependency> |
||||
|
<dependentAssembly> |
||||
|
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> |
||||
|
</dependentAssembly> |
||||
|
</dependency> |
||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3"> |
||||
|
<windowsSettings> |
||||
|
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness> |
||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware> |
||||
|
</windowsSettings> |
||||
|
</application> |
||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> |
||||
|
<security> |
||||
|
<requestedPrivileges> |
||||
|
<requestedExecutionLevel level="requireAdministrator"/> |
||||
|
</requestedPrivileges> |
||||
|
</security> |
||||
|
</trustInfo> |
||||
|
</assembly> |
Binary file not shown.
@ -0,0 +1,15 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"github.com/braintree/manners" |
||||
|
"net/http" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
err := manners.ListenAndServe(":54022", http.DefaultServeMux) |
||||
|
if err == nil { |
||||
|
fmt.Println("哼") |
||||
|
} |
||||
|
fmt.Println("哈哈") |
||||
|
} |
Loading…
Reference in new issue