如何使用编码器/解码器发送/接收Go Unix套接字JSON字符串
我们正在构建一个在每个节点上运行的简单缓存进程。每个都有多个服务启动并运行,并尝试连接到此本地缓存进程,该进程接收JSON字符串作为输入,并以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
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的提示。是的,它按预期工作。我认为,当我们在多种编程语言之间切换时,就会发生这种情况:-)