linux - 通过套接字连接发送/接收 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 中读取时,我似乎根本无法获得任何数据。
任何帮助深表感谢!
解决方案
推荐阅读
- laravel - 雄辩的模型 setRelation 生成数组而不是 Collection
- javascript - 用户定义的函数如何在 javascript 中继承原型属性
- powershell - PowerShell 中的 bool[] 中是否可以包含 [Nullable[bool]]
- php - 获取列名中的特定自定义参数值
- sql - phpmyadmin程序查询
- python - 在 Python 中严格搜索和替换文本
- javascript - 未使用 document.getElementById('someId').appendChild() 添加的函数
- android - 我可以让 apk 在移动和 android-TV 中使用吗?
- python - 如何查看python中内置函数的源代码?例如:eval()
- html - css翻转动画在Mozilla中不起作用