gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:05:01 24 4
gpt4 key购买 nike

<分区>

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com