2017-04-05 13 views
0

すべてのノードで実行される簡単なキャッシュプロセスを構築しています。それぞれが複数のサービスを起動し、このローカルキャッシュプロセスに接続しようとします。このプロセスはJSON文字列を入力として受け取り、必要な詳細をJSON形式で送信します。Encode/Decoderを使用してUnix Socket JSON文字列を送信/受信する方法

今のところ、以下のアプローチを試みましたが、エンコーダとのローカルソケット通信のようですが、デコーダは空の結果を出しています。

Serverコード

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を使用しています。

答えて

2

JSONマーシャリング/アンマーシャリングは、構造体のパブリックフィールドのみを考慮します。つまり、その名前は大文字で始まる必要があります。

+0

このヒントをいただきありがとうございます。うん、それは期待どおりに働いています。私はこれが複数のプログラミング言語の間で切り替えるとどうなるかと思います:-) – user3620473

関連する問題