当前位置: 首页 > 知识库问答 >
问题:

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

林博厚
2023-03-14

我正在尝试通过 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的问题相同。此时我没有实现任何标准函数。

有人能给我一个关于这个函数的提示或示例代码吗?

共有1个答案

漆雕兴平
2023-03-14

你可以试试这个

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))
    }
}
 类似资料:
  • tcp 客户端例程 tcp 客户端例程 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 程序清单:tcp 客户端 * * 这是一个 tcp 客户端的例程 *

  • 我试图将一个对象从服务器端发送到客户端,但找不到问题。以下是我在客户端遇到的错误: 下面是服务器端方法:无限循环中的separate方法只是从文件中读取,并将用户名和密码解析为ArrayList,这是服务器类中的实例变量。 以下是从服务器请求信息的客户端: 我对学习服务器套接字和套接字还不熟悉,但我在这里试图实现的是以下目标。当我在另一节课上按下按钮时,我会这样做: 几乎是一个通过服务器到clei

  • 提示 视频 PPT 下载 背景介绍 socket 编程一般采用客户端-服务器模式,即由客户进程向服务器进程发出请求,服务器进程执行请求的任务并将执行结果返回给客户进程的模式。 本教程介绍了如何编写一个基于 socket 编程实现的 TCP 客户端。我们先将 socket 编程的流程列出来,然后给出具体的实例。 TCP 客户端的 socket 编程流程 1. 创建 socket 2. 建立连接 3.

  • 我在使用“json.stringify”和“json.parse”表示字符串时遇到了问题。该应用程序通过Javascript使用客户端浏览器通过PHP从服务器读取文本文件(JSON字符串)。 > 如果不使用“stringify”,它将与文本文件中的原始文本打印相同。 如果我使用“json.stringify”,那么使用“json.parse”将显示如下错误: JSON中JSON.parse()位置

  • TCPClient 除了包含上面的继承自 SocketClient 的设置以外,还有以下几个可以设置的字段: Linger 字段 用于设置当连接中仍有数据等待发送或接受时的 Close 方法的行为。 如果其值小于 0(默认),Close 方法立即返回,操作系统停止后台数据发送;如果其值等于 0,Close 立刻返回,操作系统丢弃任何未发送或未接收的数据;如果其值大于 0,Close 方法阻塞最多

  • 我有一个java应用程序,它可以作为服务器,使用java监听一些端口。网DatagramSocket类。服务器能够从其他一些java客户端接收数据包。我没有做到的是在服务器上安装一个javascript客户端。我尝试过以WebSocket客户端发送消息 但我在浏览器控制台中发现以下错误: 应用程序。到“ws://localhost:9999/”的js:9 WebSocket连接失败: 我还尝试使用