Golang中如何将输出写入net.Listen
Golang中如何将输出写入net.Listen 大家好
场景
Shell 1:正在某个端口上运行 net.Listen
Shell 2:通过 net.Dial 连接到 Shell 1。我想要执行输入/输出并在 Shell 1 中看到结果。例如,如果我在 Shell 1 中输入"hello",我希望它能出现在 Shell 2 中。实现这种行为的最佳包是什么?假设我已经可以发送基本的文本命令。
2 回复
更多关于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)
}
}
运行步骤
-
在Shell 1中运行服务器端代码:
go run server.go服务器将开始监听端口8080。
-
在Shell 2中运行客户端代码:
go run client.go客户端将连接到服务器。
-
在任意一个Shell中输入文本(例如"hello"),它将在另一个Shell中显示。例如:
- 在Shell 1输入"hello",Shell 2将输出"hello"。
- 在Shell 2输入"world",Shell 1将输出"world"。
关键点说明
- 使用
net.Listen和net.Dial建立TCP连接。 - 使用
io.Copy处理数据流的读写,它自动处理缓冲和错误。 - 通过goroutine并发处理输入和输出,避免阻塞。
- 此方法适用于基本的文本命令交互;对于复杂协议,可能需要自定义解析逻辑。
此实现基于标准库,无需额外包,是Go中处理网络I/O的常见方式。


