一、服务器设计
1. 注册端口;
2. 监听端口 —— ListenTCP( );
3. 接收请求 —— Accept( );
4. 接收数据 或 发送数据 —— Read( ) 或 Write( );
// Server.go package main import "fmt" import "os" import "net" func main() { service := ":6000" tcpaddr, err := net.ResolveTCPAddr("tcp", service) checkError(err) listener, err := net.ListenTCP("tcp", tcpaddr) checkError(err) for { conn, err := listener.Accept() if err != nil { continue } go handleClient(conn) //conn.Close() } } func handleClient(conn net.Conn) { defer conn.Close() var buf [512]byte for { n, err := conn.Read(buf[0:]) if err != nil { return } rmtAddr := conn.RemoteAddr() fmt.Println("rcv msg from client", rmtAddr.String(), string(buf[0:n])) _, err2 := conn.Write([]byte("hello client")) if err2 != nil { return } } } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "fatal error:%s", err.Error()) os.Exit(1) } }
二、客户端设计
1. 获取地址;
2. 发送请求;
3. 接收数据 或 发送数据 —— Read( ) 或 Write( );
4. 关闭连接 —— Close( );
// client.go package main import ( "fmt" "net" "os" ) func main() { var buf [512]byte service := os.Args[1] tcpaddr, err := net.ResolveTCPAddr("tcp", service) checkError(err) conn, err := net.DialTCP("tcp", nil, tcpaddr) checkError(err) rmtaddr := conn.RemoteAddr() n, err := conn.Write([]byte("hello server")) checkError(err) n, err = conn.Read(buf[0:]) checkError(err) fmt.Println("reply from server", rmtaddr.String(), string(buf[0:n])) conn.Close() os.Exit(0) } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "fatal error:%s", err.Error()) os.Exit(1) } }