【问题标题】:TCP send Stdout to client and read Stdin from clientTCP 将标准输出发送到客户端并从客户端读取标准输入
【发布时间】:2017-02-24 09:30:05
【问题描述】:

我正在尝试通过 tcp 连接远程执行程序 我想在客户端服务器之间实时共享标准输出和标准输入。

我有以下没有错误处理的测试服务器:p 我知道,目前我无法执行带参数的程序, 但这很容易处理:)

package main

import (
    "bufio"
    "bytes"
    "fmt"
    "net"
    "os/exec"
    "strings"
)

func main() {
    l, _ := net.Listen("tcp", ":420")
    defer l.Close()

    for {
        // Wait for a connection.
        conn, _ := l.Accept()

        go func(c net.Conn) {
            for {

                msg, _ := bufio.NewReader(conn).ReadString('\n')
                program := strings.Trim(msg, "\r\n")

                cmd := exec.Command(program)
                var b bytes.Buffer
                cmd.Stdout = &b
                //cmd.Stdin = &bi
                cmd.Run()
                c.Write([]byte(b.String() + "\n")) //not working
                fmt.Println(b.String())            //working
            }
            //connection closed
            c.Close()
        }(conn)
    }
}

你看,我尝试与 c.Write() 共享标准输出,但这不起作用。

我认为 cmd.Stdin 的另一个问题与 Stdout 的问题相同。 目前我没有实现任何标准输入函数。

谁能给我这个函数的提示或示例代码?

【问题讨论】:

  • 你说“我尝试与 c.Write() 共享标准输出”是什么意思?
  • 不确定这是否是您想要的,请使用io.Copynet.Conn 作为源,os.Stdout 作为目标。
  • @Flimzy 我的意思是我的代码示例中的以下部分:c.Write([]byte(b.String() + "\n"))
  • 所以你的意思是当你写到网络时,什么都没有收到?
  • @Flimzy 是的,客户端没有收到输出,但服务器使用 fmt.Println(b.String()) 打印输出

标签: go tcp stdout stdin


【解决方案1】:

你可以试试这个

package main

import (
    "bufio"
    "bytes"
    "fmt"
    "net"
    "os/exec"
    "strings"
)

func main() {
    l, _ := net.Listen("tcp", ":8888")
    defer l.Close()

    for {
        // Wait for a connection.
        conn, _ := l.Accept()

        go func(c net.Conn) {
            for {
                msg, err := bufio.NewReader(conn).ReadString('\n')
                if err != nil {
                    break
                }
                program := strings.Trim(msg, "\r\n")

                cmd := exec.Command(program)
                var b bytes.Buffer
                cmd.Stdout = &b
                cmd.Run()
                conn.Write(b.Bytes())
            }
            //connection closed
            c.Close()
        }(conn)
    }
}

客户

package main

import (
    "fmt"
    "net"
)

func main() {

    conn, _ := net.Dial("tcp", "127.0.0.1:8888")
    for {
        fmt.Print("Command to send: ")
        reader := bufio.NewReader(os.Stdin)
        text, _ := reader.ReadString('\n')
        conn.Write([]byte(fmt.Sprintf("%s\r\n", text)))
        b := make([]byte, 512)
        conn.Read(b)
        fmt.Println(string(b))
    }
}

【讨论】:

  • 这对我来说是一样的。客户端没有收到任何东西(可能是客户端问题??)但我知道,如果我发送命令“帮助”,我会得到一些字符...
  • @overboarded 简单客户端已添加
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多