Go语言TCP/UDP Socket编程
1. TCP编程
TCPClient
// TCPClient project main.go package main import ( "fmt" "net" "os" ) func main() { var buf [512]byte if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[0]) os.Exit(1) } service := os.Args[1] tcpAddr, err := net.ResolveTCPAddr("tcp4", service) checkErr(err) conn, err := net.DialTCP("tcp", nil, tcpAddr) defer conn.Close() checkErr(err) rAddr := conn.RemoteAddr() n, err := conn.Write([]byte("Hello server!")) checkErr(err) n, err = conn.Read(buf[0:]) checkErr(err) fmt.Println("Reply from server ", rAddr.String(), string(buf[0:n])) os.Exit(0) } func checkErr(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } }
TCPServer
// TCPServer project main.go package main import ( "fmt" "net" "os" ) func main() { service := ":5000" tcpAddr, err := net.ResolveTCPAddr("tcp4", service) checkErr(err) listener, err := net.ListenTCP("tcp", tcpAddr) checkErr(err) for { conn, err := listener.Accept() if err != nil { continue } go handleClient(conn) } } func checkErr(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } } func handleClient(conn net.Conn) { defer conn.Close() var buf [512]byte for { n, err := conn.Read(buf[0:]) if err != nil { return } rAddr := conn.RemoteAddr() fmt.Println("Receive from client", rAddr.String(), string(buf[0:n])) _, err2 := conn.Write([]byte("Welcome client!")) if err2 != nil { return } } }
2. UDP编程
UPDClient
// UDPClient project main.go package main import ( "fmt" "net" "os" ) func main() { var buf [512]byte if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[0]) os.Exit(1) } service := os.Args[1] udpAddr, err := net.ResolveUDPAddr("udp4", service) checkErr(err) conn, err := net.DialUDP("udp", nil, udpAddr) defer conn.Close() checkErr(err) rAddr := conn.RemoteAddr() n, err := conn.Write([]byte("Hello server!")) checkErr(err) n, err = conn.Read(buf[0:]) checkErr(err) fmt.Println("Reply from server ", rAddr.String(), string(buf[0:n])) os.Exit(0) } func checkErr(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } }
UDPServer
// UDPServer project main.go package main import ( "fmt" "net" "os" ) func main() { service := ":5000" udpAddr, err := net.ResolveUDPAddr("udp4", service) checkErr(err) conn, err := net.ListenUDP("udp", udpAddr) checkErr(err) for { handleClient(conn) } } func checkErr(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } } func handleClient(conn *net.UDPConn) { defer conn.Close() var buf [512]byte for { n, rAddr, err := conn.ReadFromUDP(buf[0:]) if err != nil { return } fmt.Println("Receive from client", rAddr.String(), string(buf[0:n])) _, err2 := conn.WriteToUDP([]byte("Welcome client!"), rAddr) if err2 != nil { return } } }