2012-06-26 15 views
18

git Programlama TCP üzerinden ağız veri göndermek için açılamıyor:</p> <p>İstemci TCP bağlantısını kullanarak, bir istemci sunucu uygulaması vardır

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) 
} 

Sunucu:

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) 
} 

hizmet üzerinde sonucudur {0, 0} çünkü net.Conn'dan bytes.Buffer değişkenini nasıl elde edeceğimi bilmiyorum.

TCP üzerinden gob değişkenleri göndermek için herhangi bir yolu var mı?

Doğruysa, bu nasıl yapılabilir? Ya da TCP üzerinden numara göndermede herhangi bir alternatif var mı?

Herhangi bir yardım veya örnek kod gerçekten takdir edilecektir.

cevap

41

İşte tam bir örnek.

Sunucu:

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 
    } 
} 

Müşteri:

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"); 
} 

başlatın sonra sunucu, istemci ve sunucu alınan P değeri görüntüleneceğinden.

Bir kaç inceleme açıklığa kavuşturmak için: Bir soketi dinlediğimiz zaman

  • , bunu idare edecek bir goroutine açık soket geçmelidir.
  • Conn kolay kullanımı kolaylaştırır Reader ve Writer arabirimleri, uygular: siz muhtemelen iki programda
  • tarafından ithal bir paket içinde P yapı tanımını olurdu Gerçek bir uygulamada bir Decoder veya Encoder
  • verebilirsin
+0

Örneğiniz harika çalışıyor. Teşekkürler. Tek sorum şu ki, sonucu sunucudan istemciye nasıl gönderebilirim? – Emanuel

+9

Bir soket iki yönlüdür. Sadece 'handleConnection' işlevinde, tam olarak istemciye yazdığınız gibi yazın. –

+0

Bu harika çalışıyor. Örnek için teşekkürler. Sunucuya bir {map [string] string} göndermek istiyorum. Ancak sunucu sonunda çözülmez. Bu konuda herhangi bir öneriniz var mı? – Dany

İlgili konular