Golang中如何将输出写入net.Listen

Golang中如何将输出写入net.Listen 大家好

场景

Shell 1:正在某个端口上运行 net.Listen

Shell 2:通过 net.Dial 连接到 Shell 1。我想要执行输入/输出并在 Shell 1 中看到结果。例如,如果我在 Shell 1 中输入"hello",我希望它能出现在 Shell 2 中。实现这种行为的最佳包是什么?假设我已经可以发送基本的文本命令。

2 回复

Opensource.com

缩略图

使用Go构建并发TCP服务器

开发一个并发的TCP服务器,仅用约65行Go代码生成随机数。

这是一个很好的实现

更多关于Golang中如何将输出写入net.Listen的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,您可以使用net包结合io.Copy或手动读写来实现两个Shell之间的双向通信。以下是一个完整的示例,展示如何在Shell 1(服务器端)监听连接,并在Shell 2(客户端)连接后进行输入/输出交互,确保数据双向传输。

示例代码

Shell 1:服务器端代码(使用 net.Listen)

服务器端监听一个端口(例如8080),接受客户端连接,然后从标准输入读取数据发送到客户端,同时从客户端接收数据并打印到标准输出。

package main

import (
    "io"
    "log"
    "net"
    "os"
)

func main() {
    // 监听TCP端口8080
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatal("监听错误:", err)
    }
    defer listener.Close()
    log.Println("服务器正在监听 :8080")

    // 接受客户端连接
    conn, err := listener.Accept()
    if err != nil {
        log.Fatal("接受连接错误:", err)
    }
    defer conn.Close()
    log.Println("客户端已连接:", conn.RemoteAddr())

    // 从标准输入读取数据并发送到客户端
    go func() {
        _, err := io.Copy(conn, os.Stdin)
        if err != nil {
            log.Println("发送数据错误:", err)
        }
    }()

    // 从客户端接收数据并打印到标准输出
    _, err = io.Copy(os.Stdout, conn)
    if err != nil {
        log.Println("接收数据错误:", err)
    }
}

Shell 2:客户端代码(使用 net.Dial)

客户端连接到服务器端,从标准输入读取数据发送到服务器,同时从服务器接收数据并打印到标准输出。

package main

import (
    "io"
    "log"
    "net"
    "os"
)

func main() {
    // 连接到服务器地址(例如本地8080端口)
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
        log.Fatal("连接错误:", err)
    }
    defer conn.Close()
    log.Println("已连接到服务器")

    // 从标准输入读取数据并发送到服务器
    go func() {
        _, err := io.Copy(conn, os.Stdin)
        if err != nil {
            log.Println("发送数据错误:", err)
        }
    }()

    // 从服务器接收数据并打印到标准输出
    _, err = io.Copy(os.Stdout, conn)
    if err != nil {
        log.Println("接收数据错误:", err)
    }
}

运行步骤

  1. 在Shell 1中运行服务器端代码:

    go run server.go
    

    服务器将开始监听端口8080。

  2. 在Shell 2中运行客户端代码:

    go run client.go
    

    客户端将连接到服务器。

  3. 在任意一个Shell中输入文本(例如"hello"),它将在另一个Shell中显示。例如:

    • 在Shell 1输入"hello",Shell 2将输出"hello"。
    • 在Shell 2输入"world",Shell 1将输出"world"。

关键点说明

  • 使用net.Listennet.Dial建立TCP连接。
  • 使用io.Copy处理数据流的读写,它自动处理缓冲和错误。
  • 通过goroutine并发处理输入和输出,避免阻塞。
  • 此方法适用于基本的文本命令交互;对于复杂协议,可能需要自定义解析逻辑。

此实现基于标准库,无需额外包,是Go中处理网络I/O的常见方式。

回到顶部