TCP将Stdout发送到客户端并从客户端读取Stdin

时间:2017-02-24 09:30:06

标签: go tcp stdout stdin

我正在尝试通过tcp连接执行远程程序 我想在客户端<>服务器之间共享stdout和stdin。

我有以下测试服务器没有错误处理: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()共享stdout,但这不起作用。

我认为cmd.Stdin的另一个问题与Stdout的问题相同。 此刻我没有实现任何Stdin函数。

有人可以给我这个功能的提示或示例代码吗?

1 个答案:

答案 0 :(得分:0)

你可以尝试这个

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))
    }
}