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"

我一直在网上搜索,但到目前为止没有找到。 如果有人能给我示例代码,我将能够以此为基础进行工作。

此致

6 回复

感谢你的回复,NobbZ。

你能给我一些发送到服务器的示例代码吗?

致以问候, Mahan

更多关于Golang实现HEX到TCP/IP服务器的转换及HEX数据接收的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不,我甚至不知道您需要的是UDP还是TCP连接……

请参考 net 包的文档,其中包含了实现此功能所需的基本函数:

https://golang.org/pkg/net/

到目前为止你尝试了什么,遇到了什么错误?

如果你觉得有帮助,可以在代码中直接使用 []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)
    }
}

运行说明:

  1. 先运行服务器端代码
  2. 再运行客户端代码
  3. 客户端会发送HEX数据到服务器,并接收服务器的响应

关键点说明:

  • hex.DecodeString():将HEX字符串转换为字节数组
  • hex.EncodeToString():将字节数组转换为HEX字符串
  • conn.Write():发送字节数据到TCP连接
  • conn.Read():从TCP连接读取数据
  • 代码中包含了HEX字符串的格式化处理,可以处理带空格和不带空格的HEX输入

你可以根据实际需求修改服务器端的响应数据和处理逻辑。

回到顶部