如何使用编码器/解码器发送/接收Go Unix Socket JSON字符串

时间:2017-04-05 11:17:17

标签: json go marshalling

我们正在构建一个在每个节点上运行的简单缓存进程。每个服务都启动并运行多个服务,并尝试连接到此本地缓存进程,该进程接收JSON字符串作为输入,并以JSON格式发送所需的详细信息。

截至目前,我们已经尝试了以下方法,似乎与编码器,解码器的本地套接字通信给出了空结果。

服务器代码

package main

import (
    "encoding/json"
    "fmt"
    "net"
    "os"
)

var sockLocArg = "/tmp/.testsock"

type sockOut struct {
    keyCheckSum   uint32 `json:"keyCheckSum"`
    valueCheckSum uint32 `json:"valueCheckSum"`
    emsg          string `json:"emsg"`
}

type sockIn struct {
    action   string `json:"action"`
    compName string `json:"compname"`
}

func processSockRequest(c net.Conn) {

    defer c.Close()
    decode := json.NewDecoder(c)
    encode := json.NewEncoder(c)

    var inputJSON sockIn
    err := decode.Decode(&inputJSON)
    if err != nil {
        fmt.Printf("Error is %v", err)
    }
    fmt.Printf("Action: %s, CompName: %s\n", inputJSON.action, inputJSON.compName)

    outputJSON := sockOut{
        keyCheckSum:   10,
        valueCheckSum: 10,
        emsg:          "",
    }
    // Send response back to the socket request
    err = encode.Encode(outputJSON)
    if err != nil {
        fmt.Printf("Error is %v", err)
    }
}

func initSocket() {
    // Creating the unix domain TCP socket
    //
    localSocket, err := net.Listen("unix", sockLocArg)
    if err != nil {
        fmt.Printf("Unable to create unix domain socket. Error: %v", err)
        os.Exit(1)
    }
    // Set the permissions 700 on this
    //
    if err = os.Chmod(sockLocArg, 0700); err != nil {
        fmt.Printf("Unable to change the permissions for the socket. Error: %v", err)
        os.Exit(1)
    }
    // Initiate and listen to the socket
    //
    for {
        SockFileDescriptor, err := localSocket.Accept()
        if err != nil {
            fmt.Printf("Unable to accept incoming messages over the socket. Error: %v", err)
            os.Exit(1)
        }
        processSockRequest(SockFileDescriptor)
    }
}

func main() {
    initSocket()
}

客户代码

package main

import (
    "encoding/json"
    "fmt"
    "net"
)

type sockOut struct {
    keyCheckSum   uint32 `json:"keyCheckSum"`
    valueCheckSum uint32 `json:"valueCheckSum"`
    emsg          string `json:"emsg"`
}

type sockIn struct {
    action   string `json:"action"`
    compName string `json:"compname"`
}

func main() {
    c, err := net.Dial("unix", "/tmp/.testsock")
    if err != nil {
        panic(err)
    }
    defer c.Close()

    //go reader(c)

    decode := json.NewDecoder(c)
    encode := json.NewEncoder(c)

    inputJSON := sockIn{
        action:   "GET",
        compName: "TEST",
    }
    err = encode.Encode(inputJSON)

    if err != nil {
        fmt.Printf("Error is: %v", err)
    }
    var outputJSON sockOut
    err = decode.Decode(&outputJSON)

    if err != nil {
        fmt.Printf("Error is %v", err)
    }
    fmt.Printf("KeyCheckSum: %d, ValueCheckSum: %d Error: %s\n", outputJSON.keyCheckSum, outputJSON.valueCheckSum, outputJSON.emsg)
}

输出

启动服务器

bin/serv &
[1] 6195

正在运行客户端

$ bin/client 
Action: , CompName: 
KeyCheckSum: 0, ValueCheckSum: 0 Error: 

有人会为我们在服务器和客户端通信之间获取此空字符串提供一些指导。我们正在使用Go版本go1.8 darwin / amd64。

1 个答案:

答案 0 :(得分:2)

JSON编组/解组只考虑结构中的公共字段;即,他们的名字必须以大写字母开头。