2016-03-31 12 views
0

私は第2のサーバーとの接続を正常に開くサーバーを持っています。 2番目のサーバーがアクションを実行し、同じ接続でJSONを使用して最初のサーバーに返信しようとしています。開いているTCPソケットでJSONを返信する

私はラインconn.Write(C)にエラーが発生し、次の取得
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(タイプNewContainerJSON)を使用することはできません2つの質問:

1:このエラーはどういう意味ですか? conn.Write関数を使用するときに 'c'をByteとして使用することはできないが、json.EncoderはconnWriteが使用できる形式にJSONを変換してはいけないと不平を言っているようです。

2:オープン接続を使用してJSONを最初のサーバーにどのくらい戻すことができますか?

答えて

3

encoderは、このライン上conncのJSONエンコーディングを書き込みます

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

あなたがする必要があるすべてですこと。 conn.Write(c)への呼び出しを削除します。

タイプの不一致のため、Writeの値としてcの値を使用できないというエラーメッセージが表示されます。 NewContainerJSON[]byteではありません。

0

あなたはまずこれは、クライアント側で、それはエラーが発生しやすいでしょう

resp := []byte("And here's our repomse") 
conn.Write(resp) 

により、接続に文字列を書き込みます。この接続でjsonデコーダを使用する前に、正確に同じ量のデータを読み込む必要があります。

json通信に接続が使用されている場合、このストリーム上のすべてのメッセージはjsonでなければなりません。 通知するメッセージを送信する場合は、そのメッセージもエンコードしてください。

,
関連する問題