首页 > 解决方案 > 通过套接字连接发送/接收 TUI 数据

问题描述

我有一个 TUI(文本用户界面)程序,我想通过网络连接提供服务。下面发布了来自登录页面的示例(现在并没有做太多)。我正在为我的 TUI 库使用tui-go 。

程序.go

package main

import (
    "log"
    "github.com/marcusolsson/tui-go"
)

var logo string = "My Logo"

func main() {
    Login()
}

func Login() {
    inUser := tui.NewEntry()
    inUser.SetFocused(true)

    inPass := tui.NewEntry()
    inPass.SetEchoMode(tui.EchoModePassword)

    form := tui.NewGrid(0, 0)
    form.AppendRow(tui.NewLabel("Username"), tui.NewLabel("Password"))
    form.AppendRow(inUser, inPass)

    // TODO: create OnActivated function
    btnLogin := tui.NewButton("[Login]")

    // TODO: create OnActivated function
    btnRegister := tui.NewButton("[Register]")

    buttons := tui.NewHBox(
        tui.NewSpacer(),
        tui.NewPadder(1, 0, btnLogin),
        tui.NewPadder(1, 0, btnRegister),
    )

    window := tui.NewVBox(
        tui.NewPadder(1, 1, form),
        buttons,
    )
    window.SetBorder(true)

    root := tui.NewVBox(
        tui.NewSpacer(),
        window,
        tui.NewSpacer(),
    )

    tui.DefaultFocusChain.Set(inUser, inPass, btnLogin, btnRegister)

    ui, err := tui.New(root)
    if err != nil {
        log.Fatal(err)
    }

    ui.SetKeybinding("Esc", func() { ui.Quit() })

    if err := ui.Run(); err != nil {
        log.Fatal(err)
    }
}

然后我有另一个程序在 pty 中执行 program.go 的二进制文件,并通过套接字发送它。理想情况下,我希望用户使用多种方法进行连接,例如 telnet、ssh 或 netcat。问题是,当我通过套接字发送 pty 时,它的行为与我只是从我的 shell 运行 program.go 的二进制文件时不同。下面是我的服务器程序的副本。我正在使用pty库来创建通过套接字发送的 *os.File。

服务器.go

package main

import (
    "net"
    "log"
    "io"
    "os/exec"
    "github.com/kr/pty"
)

func main() {
    ln, err := net.Listen("tcp", ":2323")
    if err != nil {
        log.Fatal(err)
    }
    defer ln.Close()
    for {
        conn, err := ln.Accept()
        if err != nil {
            log.Fatal(err)
        }
        go startProg(conn)
    }
}

func startProg(conn net.Conn) {
    defer conn.Close()

    term, err := pty.StartWithSize(
        exec.Command("./program"),
        &pty.Winsize{Cols: 100, Rows: 30},
    )
    if err != nil {
        log.Fatal(err)
    }
    defer term.Close()

    go io.Copy(term, conn)
    io.Copy(conn, term)
}

无论如何,TUI 是否可以正常工作,就好像它通常可以从 shell 运行一样?另外,我将如何读取用户输入到 TUI 的数据?因为当尝试从连接和 pty 返回的 *os.File 中读取时,我似乎根本无法获得任何数据。

任何帮助深表感谢!

标签: linuxgonetworkingtui

解决方案


推荐阅读