
在go语言中构建网络服务器是常见的任务。当我们需要处理基于行的协议,例如某些简单的文本协议时,从tcp连接中逐行读取数据并进行处理就变得尤为重要。本教程将展示如何实现一个tcp服务器,该服务器监听特定端口,接受客户端连接,并将其发送的每一行数据直接输出到服务器的控制台。
net.Conn接口提供了读写字节流的能力,但它本身并没有直接提供按行读取的方法。客户端发送的数据通常是字节流,可能包含多个行,每行以换行符(\n)结束。为了实现逐行读取,我们需要一个能够缓冲并识别行分隔符的工具。
Go标准库中的bufio包提供了一个Reader类型,它能够包装一个io.Reader(net.Conn实现了io.Reader接口),并提供缓冲和高级的读取方法,其中就包括ReadString。
bufio.Reader的ReadString(delim byte)方法会从输入流中读取数据,直到遇到指定的delim字节(例如\n),或者遇到错误(包括io.EOF)。它会返回读取到的字符串(包含分隔符)以及可能发生的错误。
下面是实现上述功能的Go语言代码:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"bufio"
"fmt"
"io"
"log"
"net"
)
func main() {
// 监听TCP端口2000
srv, err := net.Listen("tcp", ":2000")
if err != nil {
log.Fatalf("无法监听端口: %v", err)
}
defer srv.Close() // 确保在main函数退出时关闭监听器
fmt.Println("TCP服务器已启动,监听端口 2000...")
for {
// 接受新的客户端连接
conn, err := srv.Accept()
if err != nil {
log.Printf("接受连接失败: %v", err)
continue // 继续接受下一个连接
}
fmt.Printf("新客户端连接来自: %s\n", conn.RemoteAddr())
// 为每个连接启动一个Goroutine进行处理
go handleConnection(conn)
}
}
// handleConnection 处理单个客户端连接
func handleConnection(c net.Conn) {
defer c.Close() // 确保在函数退出时关闭客户端连接
fmt.Printf("开始处理连接 %s\n", c.RemoteAddr())
// 将net.Conn包装成bufio.Reader,以便逐行读取
reader := bufio.NewReader(c)
for {
// 逐行读取数据,直到遇到换行符 '\n'
line, err := reader.ReadString('\n')
if err == io.EOF {
// 客户端关闭了连接
fmt.Printf("客户端 %s 已断开连接。\n", c.RemoteAddr())
break
} else if err != nil {
// 其他读取错误
log.Printf("从 %s 读取数据时发生错误: %v", c.RemoteAddr(), err)
break
}
// 成功读取到一行数据,打印到服务器的标准输出
// fmt.Print() 会直接输出字符串,包括其中的换行符
fmt.Print(line)
}
fmt.Printf("连接 %s 处理结束。\n", c.RemoteAddr())
}go build -o server server.go
./server
您将看到输出 TCP服务器已启动,监听端口 2000...
telnet localhost 2000
您将看到 Connected to localhost. 等信息。
test 123 foobar Go is great!
当您输入并按回车后,这些行将立即显示在运行 ./server 的那个终端窗口中。
通过本教程,我们学习了如何利用Go语言的 net 包和 bufio 包构建一个简单的TCP服务器,该服务器能够高效地接收客户端连接,并逐行读取其发送的数据并输出到标准输出。掌握 bufio.Reader 的 ReadString 方法是处理基于行文本协议的关键。在实际应用中,请务必考虑完善的错误处理、资源管理以及在高并发场景下的输出同步问题。
以上就是Go语言实现TCP服务器:逐行读取客户端输入并输出到控制台的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号