2012-06-26 8 views
18

मैं एक ग्राहक सर्वर अनुप्रयोग है में टीसीपी से अधिक खखार डेटा भेजने के लिए, में असमर्थ: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 से bytes.Buffer चर कैसे प्राप्त करें।

क्या टीसीपी पर गोब चर भेजने के लिए कोई तरीका है?

यदि सही है, तो यह कैसे किया जा सकता है? या टीसीपी पर संख्या भेजने में कोई विकल्प है?

कोई भी मदद या नमूना कोड वास्तव में सराहना की जाएगी।

उत्तर

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

लॉन्च सर्वर है, तो ग्राहक, और आप सर्वर प्राप्त पी मूल्य प्रदर्शित देखते हैं।

कुछ टिप्पणियों से यह स्पष्ट करने के लिए:

  • जब आप एक सॉकेट पर सुनने, आप एक goroutine है कि यह संभाल लेंगे लिए खुला सॉकेट पास करना चाहिए।
  • Conn लागू करता Reader और Writer इंटरफेस है, जो यह आसान उपयोग करने के लिए बनाता है: आप तो आप शायद दोनों कार्यक्रमों
  • द्वारा आयातित एक पैकेज में P struct परिभाषा होता कोई वास्तविक आवेदन में एक Decoder या Encoder
  • को दे सकते हैं
+0

आपका उदाहरण शानदार काम करता है। धन्यवाद। केवल सवाल है कि मैं सर्वर से वापस क्लाइंट को परिणाम कैसे भेज सकता हूं? – Emanuel

+9

एक सॉकेट बिडरेक्शननल है। जैसा कि आप क्लाइंट में लिखते हैं, बस 'हैंडल कनेक्शन' फ़ंक्शन में इसे लिखें। –

+0

यह बहुत अच्छा काम करता है। उदाहरण के लिए धन्यवाद। मैं सर्वर पर एक {नक्शा [स्ट्रिंग] स्ट्रिंग} भेजना चाहता हूं। लेकिन यह सर्वर के अंत में डीकोड नहीं किया जाता है। इस पर कोई सुझाव? – Dany

संबंधित मुद्दे