要实现一个Go语言的TCP服务端,处理客户端发送的十六进制字符串数据,可以遵循以下步骤:
1. 导入所需包
go
import (
"encoding/hex"
"fmt"
"net"
"log"
)
除了之前所需的net、fmt和log包之外,这里还导入了encoding/hex包,用于处理十六进制编码与解码。
2. 监听端口
与普通TCP服务端相同,创建监听器并绑定端口:
go
listenAddr := ":8080" // 监听所有可用网络接口上的8080端口
listener, err := net.Listen("tcp", listenAddr)
if err != nil {
log.Fatal("Failed to listen:", err)
}
defer listener.Close()
fmt.Println("TCP server listening on", listenAddr)
3. 接受连接
同样在无限循环中接受客户端连接,并使用goroutine处理:
go
for {
conn, err := listener.Accept()
if err != nil {
log.Println("Error accepting connection:", err)
continue
}
go handleConnection(conn)
}
4. 处理连接
定义handleConnection()函数,处理每个客户端连接并解析十六进制字符串:
go
func handleConnection(conn net.Conn) {
defer conn.Close()
fmt.Printf("Accepted connection from %s\n", conn.RemoteAddr())
// 读取客户端发送的十六进制字符串
reader := bufio.NewReader(conn)
hexString, err := reader.ReadString('\n')
if err != nil {
log.Println("Error reading from client:", err)
return
}
hexString = strings.TrimSpace(hexString) // 去除末尾换行符
// 解析十六进制字符串为字节切片
bytes, err := hex.DecodeString(hexString)
if err != nil {
log.Printf("Invalid hexadecimal string received: %s\n", err)
_, _ = conn.Write([]byte("Error: Invalid hexadecimal input.\n"))
return
}
// 对字节切片进行处理(此处仅为示例,实际应用中应替换为实际业务逻辑)
fmt.Printf("Received and decoded %d bytes: %v\n", len(bytes), bytes)
// 示例回复:将字节切片转换回十六进制字符串并发送给客户端
hexReply := hex.EncodeToString(bytes)
_, err = conn.Write([]byte(hexReply + "\n"))
if err != nil {
log.Println("Error writing to client:", err)
}
}
在这个示例中,服务端接收客户端发送的十六进制字符串,使用hex.DecodeString()将其解码为字节切片,然后进行业务处理(此处仅为打印)。最后,将处理后的字节切片重新编码为十六进制字符串并回传给客户端。实际应用中,应根据业务需求替换处理字节切片的部分逻辑。
888

被折叠的 条评论
为什么被折叠?



