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

如何使用编码器/解码器发送/接收Go Unix套接字JSON字符串,json,go,marshalling,Json,Go,Marshalling,我们正在构建一个在每个节点上运行的简单缓存进程。每个都有多个服务启动并运行,并尝试连接到此本地缓存进程,该进程接收JSON字符串作为输入,并以JSON格式发送所需的详细信息 到目前为止,我们已经尝试了以下方法,似乎本地套接字与编码器、解码器的通信给出了空结果 服务器代码 package main import ( "encoding/json" "fmt" "net" "os" ) var sockLocArg = "/tmp/.testsock" type

我们正在构建一个在每个节点上运行的简单缓存进程。每个都有多个服务启动并运行,并尝试连接到此本地缓存进程,该进程接收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)
}
客户端代码

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)
}
输出

启动服务器

运行客户端


是否有人能提供一些指导,说明为什么我们在服务器和客户端通信之间得到这个空字符串。我们正在使用Go版本go1.8 darwin/amd64。

JSON编组/解编只考虑结构中的公共字段;i、 例如,它们的名称必须以大写字母开头。

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

非常感谢佐伊德的提示。是的,它按预期工作。我认为当我们在多种编程语言之间切换时会发生这种情况:-)非常感谢Zoyd的提示。是的,它按预期工作。我认为,当我们在多种编程语言之间切换时,就会发生这种情况:-)