在打开的TCP套接字上使用JSON进行回复

时间:2016-03-31 20:55:41

标签: json go

我有一台服务器可以成功打开与第二台服务器的连接。第二个服务器执行一个操作,我试图让它在同一个连接上用JSON回复第一个服务器。

package main

import (
    "fmt"
    "net"
    "encoding/json"
)

type NewContainerJSON struct {
    Action string           `json:"Action"`
    ContainerName string    `json:"ContainerName"`
    BaseServer string       `json:"BaseServer"`
    CMS string              `json:"CMS"`
    WebsiteName string      `json:"WebsiteName"`
    DBrootPWD string        `json:"DBrootPWD"`
    DBadminUname string     `json:"DBadminUname"`
    DBadminPWD string       `json:"DBadminPWD"`
}

func main() {

    service := "127.0.0.1:8081"
    tcpAddr, err := net.ResolveTCPAddr("tcp", service)
    checkError(err)

    listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)

    conn, err := listener.Accept()
    checkError(err)

    decoder := json.NewDecoder(conn)
    encoder := json.NewEncoder(conn)

    var b NewContainerJSON
    err = decoder.Decode(&b)
    checkError(err)
    fmt.Println(b.Action)

    if b.Action == "createNew" {
        fmt.Println("This works")
        resp := []byte("And here's our repomse")
        conn.Write(resp)

        c := NewContainerJSON {
            Action: "createdNewContainer",
            ContainerName: "Test",
            BaseServer: "Test",
            CMS: "Test",
            WebsiteName: "Test",
            DBrootPWD: "Test",
            DBadminUname: "Test",
            DBadminPWD: "Test",
        }

        encoder := json.NewEncoder(conn)
        if err := encoder.Encode(c); err != nil {
            fmt.Println("encode.Encode error: ", err)
        }

        conn.Write(c)
    }
}

func checkError(err error) {
    if err != nil {
        fmt.Println("An error occurred: ", err.Error())

    }
}

我在conn.Write(c)

行上得到以下错误
  

不能使用c(类型NewContainerJSON)作为conn.Write参数中的类型[]字节

两个问题:

1:这个错误到底是什么意思?似乎抱怨说' c'使用conn.Write函数时不能用作字节,但是json.Encoder不应该将JSON转换为conn.Write可以使用的格式吗?

2:如何使用开放连接将JSON返回给第一台服务器?

2 个答案:

答案 0 :(得分:4)

encoder在此行上将c的JSON编码写入conn

if err := encoder.Encode(c); err != nil {

这就是你需要做的一切。删除对conn.Write(c)的调用。

错误消息告诉您由于类型不匹配,c的值不能用作Write的参数。 NewContainerJSON不是[]byte

答案 1 :(得分:0)

首先通过

将字符串写入连接
resp := []byte("And here's our repomse")
conn.Write(resp)

这会使客户端容易出错。在此连接上使用json解码器之前,您需要读取完全相同数量的数据。

如果连接用于json通信,则此流上的所有消息都应为json。 因此,如果您想发送要通知的消息,也要对该消息进行编码:

encoder.Encode(string(resp))