首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过套接字连接发送GUI/TUI

通过套接字连接发送GUI/TUI
EN

Stack Overflow用户
提问于 2019-01-18 05:45:15
回答 1查看 706关注 0票数 5

最近,我一直在尝试用golang创建一个程序,它在服务器上运行,并接受telnet连接。然后,我想通过该远程登录连接打开一个TUI (文本用户界面),如curses菜单(在golang中,类似于:termuigocui等)。我的问题是,我到底如何才能做到这一点,或者这甚至是可能的?我曾尝试在连接被接受时启动TUI,但它只是在服务器端打开连接,而不是在telnet客户端。据我所知,没有一种简单的方法可以仅仅通过telnet或任何其他套接字IO连接来发送TUI。

在试图弄清楚这一点的过程中,任何帮助都是非常感谢的。谢谢!:D

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-18 09:41:56

首先,您应该注意到我给出的示例是完全不安全的(不要在Internet上公开它!)而且也没有提供诸如信号处理或调整终端大小之类的东西(您可能想要考虑使用SSH )。

但为了回答您的问题,下面是一个运行TCP服务器并将远程客户端连接到在本地PTY中运行的termui程序的示例(使用https://github.com/gizak/termuihttps://github.com/kr/pty包):

代码语言:javascript
复制
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连接到该程序:

代码语言:javascript
复制
$ go run server.go
2019/01/18 01:39:37 Listening for requests on 127.0.0.1:56192
代码语言:javascript
复制
$ nc 127.0.0.1 56192

你应该会看到"Hello world“框(按回车键断开连接)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54244749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档