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