亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過套接字連接發送 GUI/TUI

通過套接字連接發送 GUI/TUI

Go
開心每一天1111 2023-06-01 17:01:07
最近我一直在嘗試用 golang 創建一個程序,它運行在服務器上,并接受 telnet 連接。然后我想通過該 telnet 連接打開一個 TUI(文本用戶界面),例如 curses 菜單(對于 golang,類似:termui、gocui等)。我的問題是,我究竟該怎么做和/或什至可能做到這一點?我嘗試在接受連接時啟動 TUI,但它只是在服務器端打開它,而不是在 telnet 客戶端。據我所知,就此而言,沒有簡單的方法可以通過 telnet 或任何其他套接字 IO 連接發送 TUI。在嘗試解決這個問題時,我們將不勝感激。謝謝!:D
查看完整描述

1 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

首先,您應該注意我給出的示例是完全不安全的(不要通過 Internet 公開它?。┎⑶乙矝]有提供諸如信號處理或調整終端大小之類的功能(您可能需要考慮改用 SSH) .

但為了回答您的問題,這里有一個運行 TCP 服務器并將遠程客戶端連接到在本地 PTY 中運行的 termui 程序的示例(同時使用 https://github.com/gizak/termui和https?://github. com/kr/pty包):


package main


import (

? ? "flag"

? ? "io"

? ? "log"

? ? "net"

? ? "os"

? ? "os/exec"


? ? ui "github.com/gizak/termui"

? ? "github.com/kr/pty"

)


var termuiFlag = flag.Bool("termui", false, "run a termui example")


func main() {

? ? flag.Parse()


? ? var err error

? ? if *termuiFlag {

? ? ? ? err = runTermui()

? ? } else {

? ? ? ? err = runServer()

? ? }

? ? if err != nil {

? ? ? ? log.Fatal(err)

? ? }

}


// runTermui runs the termui "Hello World" example.

func runTermui() error {

? ? if err := ui.Init(); err != nil {

? ? ? ? return err

? ? }

? ? defer ui.Close()


? ? p := ui.NewParagraph("Hello World!")

? ? p.Width = 25

? ? p.Height = 5

? ? ui.Render(p)


? ? for e := range ui.PollEvents() {

? ? ? ? if e.Type == ui.KeyboardEvent {

? ? ? ? ? ? break

? ? ? ? }

? ? }


? ? return nil

}


// runServer listens for TCP connections on a random port and connects

// remote clients to a local PTY running the termui example.

func runServer() error {

? ? ln, err := net.Listen("tcp", "127.0.0.1:0")

? ? if err != nil {

? ? ? ? return err

? ? }

? ? defer ln.Close()

? ? log.Printf("Listening for requests on %v", ln.Addr())

? ? for {

? ? ? ? conn, err := ln.Accept()

? ? ? ? if err != nil {

? ? ? ? ? ? return err

? ? ? ? }

? ? ? ? log.Printf("Connecting remote client %v to termui", conn.RemoteAddr())

? ? ? ? go connectTermui(conn)

? ? }

}


// connectTermui connects a client connection to a termui process running in a

// PTY.

func connectTermui(conn net.Conn) {

? ? defer func() {

? ? ? ? log.Printf("Closing remote client %v", conn.RemoteAddr())

? ? ? ? conn.Close()

? ? }()


? ? t, err := pty.StartWithSize(

? ? ? ? exec.Command(os.Args[0], "--termui"),

? ? ? ? &pty.Winsize{Cols: 80, Rows: 24},

? ? )

? ? if err != nil {

? ? ? ? log.Printf("Error starting termui: %v", err)

? ? ? ? return

? ? }

? ? defer t.Close()


? ? go io.Copy(t, conn)

? ? io.Copy(conn, t)

}

示例用法是在一個窗口中運行此程序并nc在另一個窗口中使用連接到它:


$ go run server.go

2019/01/18 01:39:37 Listening for requests on 127.0.0.1:56192

$ nc 127.0.0.1 56192

您應該會看到“Hello world”框(按回車鍵斷開連接)。


查看完整回答
反對 回復 2023-06-01
  • 1 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號