Ответ 1
Вот полный пример.
Сервер:
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.
Несколько замечаний, чтобы дать понять:
- Когда вы слушаете сокет, вы должны передать открытый сокет в goroutine, который будет обрабатывать его.
-
Conn
реализует интерфейсыReader
иWriter
, что упрощает его использование: вы можете передать егоDecoder
илиEncoder
- В реальном приложении у вас, вероятно, будет определение структуры
P
в пакете, импортированном обеими программами