用Go语言创建一个TCP echo server
此代码会在本地地址的1080端口上监听连接,并将收到的每个字节原样返回给客户端。
package main // 声明这是一个main包,包含一个main函数
import (
"bufio" // 导入bufio包,用于读取数据
"log" // 导入log包,用于打印日志
"net" // 导入net包,用于网络编程
)
func main() { // 定义main函数,程序的入口点
// 监听端口
server, err := net.Listen("tcp", "127.0.0.1:1080") // 调用net.Listen函数,创建一个tcp类型的监听器,绑定到本地地址的1080端口,并返回一个net.Listener接口和一个错误值
if err != nil { // 如果发生错误
panic(err) // 调用panic函数,终止程序并打印错误信息
}
for { // 无限循环
//接收连接
client, err := server.Accept() // 调用server.Accept方法,等待并返回一个新的连接,返回一个net.Conn接口和一个错误值
if err != nil { // 如果发生错误
log.Printf("Accept failed %v", err) // 调用log.Printf函数,打印错误信息
continue // 跳过本次循环,继续下一次循环
}
//在线程中处理连接
go process(client) // 用go关键字启动一个新的goroutine(轻量级线程),并调用process函数,传入client作为参数
}
}
func process(conn net.Conn) { // 定义process函数,接收一个net.Conn接口作为参数,用于处理连接
defer conn.Close() // 使用defer关键字,在函数返回前执行conn.Close方法,关闭连接
reader := bufio.NewReader(conn) // 调用bufio.NewReader函数,创建一个bufio.Reader对象,包装conn,用于读取数据
for { // 无限循环
b, err := reader.ReadByte() // 调用reader.ReadByte方法,读取一个字节,并返回该字节和一个错误值
if err != nil { // 如果发生错误
break // 跳出循环
}
_, err = conn.Write([]byte{b}) // 调用conn.Write方法,将读取到的字节写回到连接,并返回写入的字节数和一个错误值
if err != nil { // 如果发生错误
break // 跳出循环
}
}
}