通过Golang中的Websocket发送和接收[] []字节

时间:2018-01-05 16:17:50

标签: arrays go websocket

我有一个二维字节数组:

data := [][]byte{{104, 105}, {104, 105}}

我需要通过websocket连接传输,但是我找不到如何转换这个数组的方法,所以我可以有效地将它重新转换回我的java客户端上的二维数组。

func socketManager (connection *websocket.Conn ){

    fmt.Print("Websocket connection established ")

    //determining the request
    for {

    //awaiting messages from clients
    messageType, message, err := connection.ReadMessage()
    if err != nil {
        //ending connection when error accursed
        Logger.LogError(err.(error).Error())
        break
    }

        data := [][]byte{{104, 105}, {104, 105}}

        //How can I send this two dimensional byte array?
        err = connection.WriteMessage(websocket.BinaryMessage, message)
        if err != nil {
            log.Println("write:", err)
            break
        }




    err = connection.WriteMessage(messageType, message)
    if err != nil {
        log.Println("write:", err)
        break
    }

    }

    //closing the connection
    defer connection.Close()
}

1 个答案:

答案 0 :(得分:1)

多维数组通常根据它们的尺寸(即“宽度”和“高度”)及其内容(应分解为“行”或“列”的各个项目的整个列表来定义) )。但是,如果组成数组可能有不同的长度,那么您可能需要完全采用另一种方法。

您的任务是决定如何序列化此数据,以便客户端对其进行反序列化,并强调此传输的任何关键方面(例如数据大小,性能,易于互操作性等)。

以下是一些可能的解决方案:

  1. 矩阵尺寸和内容。如果您的数据始终具有一致的“宽度”和“高度”,那么您可以使用原始编码来序列化表示这些值的两个uint16(或其他适当的大小),然后是一系列原始字节。要反序列化,客户端只需读取两个整数即可知道矩阵的维数,然后可以相应地填充其余数据。示例消息可能如下所示(十六进制字节):

    0002 0002 6869 6869

  2. 长度和内容。如果每个子阵列可以具有不同的长度,则可以简单地原始编码“长度”元组序列(例如,作为uint32)和原始字节内容,例如, (作为十六进制字节):

    0000 0002 6869 0000 0002 6869

  3. JSON和Base64。如果互操作性和易集成性更重要(并且大数据大小不是主要问题)那么您可以简单地将数据序列化为JSON字符串数组,每个字符串都是Base64编码的字节数组。这样,客户端只需要反序列化JSON数组,并对每个元素进行Base64解码。该解决方案还容易允许不同尺寸的子阵列。示例消息可能如下所示(作为JSON字符串):

    ["aGk=","aGk="]

  4. 最终,您可以使用many builtin encoding packages来序列化此数据。没有单一的“正确”答案,因此您的实施选择应该由您的业务需求驱动。