2012-06-26 6 views
18

Tôi có một ứng dụng máy chủ của khách hàng, sử dụng kết nối TCPKhông thể gửi dữ liệu gob trên TCP tại Gò Lập trình

Chủ đầu tư:

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

Server:

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

Kết quả khi cầm giao bóng là {0, 0} vì tôi không biết cách lấy biến số bytes.Buffer từ net.Conn.

Có cách nào để gửi các biến gob qua TCP không?

Nếu đúng, làm thế nào điều này có thể được thực hiện? Hoặc có bất kỳ thay thế trong việc gửi số trên TCP?

Bất kỳ trợ giúp hoặc mã mẫu nào thực sự sẽ được đánh giá cao.

Trả lời

41

Dưới đây là ví dụ hoàn chỉnh.

Server:

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

Chủ đầu tư:

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

Launch máy chủ, sau đó khách hàng, và bạn thấy máy chủ hiển thị các giá trị P nhận được.

Một vài quan sát để làm cho nó rõ ràng:

  • Khi bạn lắng nghe trên một ổ cắm, bạn phải vượt qua các ổ cắm mở cửa cho một goroutine mà sẽ xử lý nó.
  • Conn thực hiện các ReaderWriter giao diện, mà làm cho nó dễ dàng để sử dụng: bạn có thể cho nó vào một Decoder hoặc Encoder
  • Trong một ứng dụng thực tế bạn có lẽ sẽ phải định nghĩa P struct trong một gói nhập khẩu của cả hai chương trình
+0

Ví dụ của bạn hoạt động tốt. Cảm ơn. Chỉ có câu hỏi tôi có là làm thế nào tôi có thể gửi kết quả từ máy chủ trở lại cho khách hàng? – Emanuel

+9

Ổ cắm là hai chiều. Chỉ cần viết vào nó trong hàm 'handleConnection', chính xác như bạn viết trong máy khách. –

+0

Điều này làm việc tuyệt vời. Cảm ơn ví dụ. Tôi muốn gửi một {map [string] string} đến máy chủ. Nhưng nó không được giải mã ở cuối máy chủ. Bất cứ đề nghị về điều này? – Dany