2012-06-26 13 views
18

プログラミング行くにTCP上でゴブデータを送信できません:TCPコネクションに</p> <p>クライアント使用して、私はクライアントサーバーアプリケーションを持っている

type Q struct { 
    sum int64 
} 

type P struct { 
    M, N int64 
} 

func main() { 
    ... 
    //read M and N 
    ... 
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service) 
    ... 
    var p P 
    p.M = M 
    p.N = N 
    err = enc.Encode(p) 
} 

をサーバー:

type Q struct { 
    sum int64 
} 

type P struct { 
    M, N int64 
} 

func main() { 
    ... 
    tcpAddr, err := net.ResolveTCPAddr("ip4", service) 
    listener, err := net.ListenTCP("tcp", tcpAddr) 
    ... 
    var connB bytes.Buffer 
    dec := gob.NewDecoder(&connB) 
    var p P 
    err = dec.Decode(p) 
    fmt.Printf("{%d, %d}\n", p.M, p.N) 
} 

果たす上の結果は、 {0、0}私は変数をnet.Connから取得する方法がわからないためです。

TCP上でゴブ変数を送信する方法はありますか?

trueの場合、これはどのように行うことができますか?または、TCP経由で番号を送信する方法がありますか?

ヘルプやサンプルコードは本当にありがとうございます。

答えて

41

完全な例を示します。

サーバー:

package main 

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

type P struct { 
    M, N int64 
} 
func handleConnection(conn net.Conn) { 
    dec := gob.NewDecoder(conn) 
    p := &P{} 
    dec.Decode(p) 
    fmt.Printf("Received : %+v", p); 
    conn.Close() 
} 

func main() { 
    fmt.Println("start"); 
    ln, err := net.Listen("tcp", ":8080") 
    if err != nil { 
     // handle error 
    } 
    for { 
     conn, err := ln.Accept() // this blocks until connection or error 
     if err != nil { 
      // handle error 
      continue 
     } 
     go handleConnection(conn) // a goroutine handles conn so that the loop can accept other connections 
    } 
} 

クライアント:

package main 

import (
    "fmt" 
    "log" 
    "net" 
    "encoding/gob" 
) 

type P struct { 
    M, N int64 
} 

func main() { 
    fmt.Println("start client"); 
    conn, err := net.Dial("tcp", "localhost:8080") 
    if err != nil { 
     log.Fatal("Connection error", err) 
    } 
    encoder := gob.NewEncoder(conn) 
    p := &P{1, 2} 
    encoder.Encode(p) 
    conn.Close() 
    fmt.Println("done"); 
} 

を起動し、サーバー、クライアント、およびサーバーが受信したP値の表示を参照してください。

それを明確にするためにいくつかの所見:

  • あなたがソケットに耳を傾けたとき、あなたがそれを処理するゴルーチンにオープンソケットを渡す必要があります。
  • Connは、簡単に使用できるようになりますReaderWriterインタフェースを実装:あなたは、おそらく両方のプログラム
  • によってインポートされたパッケージに P構造体の定義を持っているでしょう実際のアプリケーションでは Decoderまたは Encoder
  • にそれを与えることができます
+0

あなたの例は素晴らしいです。ありがとう。私が持っている質問だけは、サーバーからクライアントに結果を送り返す方法です。 – Emanuel

+9

ソケットは双方向です。クライアントで書くのとまったく同じ 'handleConnection'関数に書きましょう。 –

+0

これは素晴らしい作品です。この例をありがとう。 {map [string] string}をサーバーに送りたい。しかし、サーバ側ではデコードされません。これに関する提案はありますか? – Dany

関連する問題