我有一台服务器可以成功打开与第二台服务器的连接。第二个服务器执行一个操作,我试图让它在同一个连接上用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返回给第一台服务器?
答案 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))