Golang实现HEX到TCP/IP服务器的转换及HEX数据接收
Golang实现HEX到TCP/IP服务器的转换及HEX数据接收 你好,
如果我有任何错误,请见谅。
作为编程新手,我正在学习Go语言。有人能给我一个TCP/IP客户端到服务器程序的示例代码吗?
我需要向服务器发送十六进制数据,并从服务器接收十六进制数据。 如果我向服务器发送这段代码 “00 00 00 00 00 02 00 1C” 我将得到这个回复 " 00 00 00 00 02 01 1C 04 00 08 00 01 00 00 00 02 00"
我一直在网上搜索,但到目前为止没有找到。 如果有人能给我示例代码,我将能够以此为基础进行工作。
此致
感谢你的回复,NobbZ。
你能给我一些发送到服务器的示例代码吗?
致以问候, Mahan
更多关于Golang实现HEX到TCP/IP服务器的转换及HEX数据接收的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
到目前为止你尝试了什么,遇到了什么错误?
如果你觉得有帮助,可以在代码中直接使用 []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1C} 来写入你的数据。
func main() {
fmt.Println("hello world")
}
你可能不想使用 fmt.Fprintf(),而是使用 io.Read(),因为它不仅接受 []byte,而且需要它。使用 string() 将 []byte 转换为 string 是一种有损操作。生成的字符串将符合有效的 UTF-8 编码,如果这意味着必须丢弃某些字节,那么就会这样做。
此外,你应该检查所有当前被静默忽略的返回 error。
最后但同样重要的是,不要只是抛出代码,而是要解释你观察到的行为与你期望看到的行为之间的差异。
再次确认,这是TCP连接。
以下是我的示例代码:
func main() {
// connect to server
s := []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1C}
conn, _ := net.Dial("tcp", "192.168.1.65:5189")
for {
// send to server
fmt.Fprintf(conn, string(s))
// wait for reply
message, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Print("Message from server: "+message)
}
}
以下是实现TCP/IP客户端发送和接收HEX数据的Go语言示例代码:
客户端代码:
package main
import (
"encoding/hex"
"fmt"
"net"
)
func main() {
// 连接到服务器
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
fmt.Println("连接失败:", err)
return
}
defer conn.Close()
// 要发送的HEX数据
hexData := "00 00 00 00 00 02 00 1C"
// 移除空格并解码为字节
cleanHex := ""
for _, c := range hexData {
if c != ' ' {
cleanHex += string(c)
}
}
sendData, err := hex.DecodeString(cleanHex)
if err != nil {
fmt.Println("HEX解码失败:", err)
return
}
// 发送数据
_, err = conn.Write(sendData)
if err != nil {
fmt.Println("发送失败:", err)
return
}
fmt.Printf("已发送: %s\n", hexData)
// 接收响应
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("接收失败:", err)
return
}
// 将接收到的字节转换为HEX格式显示
receivedHex := hex.EncodeToString(buffer[:n])
// 每两个字符加一个空格,便于阅读
formattedHex := ""
for i := 0; i < len(receivedHex); i += 2 {
if i > 0 {
formattedHex += " "
}
formattedHex += receivedHex[i:i+2]
}
fmt.Printf("接收到: %s\n", formattedHex)
}
服务器端代码:
package main
import (
"encoding/hex"
"fmt"
"net"
)
func handleConnection(conn net.Conn) {
defer conn.Close()
// 接收数据
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
fmt.Println("读取失败:", err)
return
}
// 显示接收到的HEX数据
receivedHex := hex.EncodeToString(buffer[:n])
formattedHex := ""
for i := 0; i < len(receivedHex); i += 2 {
if i > 0 {
formattedHex += " "
}
formattedHex += receivedHex[i:i+2]
}
fmt.Printf("客户端发送: %s\n", formattedHex)
// 准备响应数据(根据你的需求修改)
responseHex := "00 00 00 00 02 01 1C 04 00 08 00 01 00 00 00 02 00"
cleanResponse := ""
for _, c := range responseHex {
if c != ' ' {
cleanResponse += string(c)
}
}
responseData, err := hex.DecodeString(cleanResponse)
if err != nil {
fmt.Println("响应HEX解码失败:", err)
return
}
// 发送响应
_, err = conn.Write(responseData)
if err != nil {
fmt.Println("发送响应失败:", err)
return
}
fmt.Printf("已发送响应: %s\n", responseHex)
}
func main() {
// 监听端口
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("监听失败:", err)
return
}
defer listener.Close()
fmt.Println("服务器启动,监听端口 8080")
for {
// 接受连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("接受连接失败:", err)
continue
}
// 处理连接
go handleConnection(conn)
}
}
运行说明:
- 先运行服务器端代码
- 再运行客户端代码
- 客户端会发送HEX数据到服务器,并接收服务器的响应
关键点说明:
hex.DecodeString():将HEX字符串转换为字节数组hex.EncodeToString():将字节数组转换为HEX字符串conn.Write():发送字节数据到TCP连接conn.Read():从TCP连接读取数据- 代码中包含了HEX字符串的格式化处理,可以处理带空格和不带空格的HEX输入
你可以根据实际需求修改服务器端的响应数据和处理逻辑。

