type TCPAddr struct {
IP IP
Port int
}
func ResolveTCPAddr(net, addr string) (*TCPAddr, error)
在呼叫函數 ResolveTCPAddr() 時,引數 net 是網路協定名,可以是“tcp”、“tcp4”或“tcp6”。引數 addr 是 IP 地址或域名,如果是 IPv6 地址則必須使用“[]”括起來。另外,埠號以“:”的形式跟隨在 IP 地址或域名的後而,埠是可選的。例如:“www.google.com:80”或“127.0.0.1:21”。
func (a *TCPAddr) Network() string
func (a *TCPAddr) String() string
import( "fmt" "net" "os" ) func main() { if len(os.Args) != 3 { fmt.Fprintf(os.Stderr, "Usage: %s networkType addrn", os.Args[0]) os.Exit(1) } networkType := os.Args[1] addr := os.Args[2] tcpAddr, err := net.ResolveTCPAddr(networkType, addr) if err != nil { fmt.Println("ResolveTCPAddr error: ", err.Error()) os.Exit(1) } fmt.Println("The network type is: ", tcpAddr.Network()) fmt.Println("The IP address is: ", tcpAddr.String()) os.Exit(0) }編譯並執行該程式,測試過程如下:
PS D:code> go run .main.go tcp c.biancheng.net:80
The network type is: tcp
The IP address is: 61.240.154.115:80
type TCPConn struct {
//空結構
)
func (c *TCPConn) Read(b []byte) (n int, err error)
func (c *TCPConn) Write(b []byte) (n int, err error)
type TCPListener struct {
//contains filtered or unexported fields
}
func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)
func (l *TCPListener) Accept() (c Conn, err error)
Accept() 方法呼叫成功後,返回 TCPConn 物件;否則,返回一個錯誤型別。
func (c *TCPConn) LocalAddr() Addr
func (c *TCPConn) RemoteAddr() Addr
// TCP Server 端設計 package main import( "fmt" "net" "os" ) func main() { service := ":5000" 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 } handleClient(conn) conn.Close() } } func handleClient(conn net.Conn) { 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 } } } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error()) os.Exit(1) } }
Func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)
在呼叫函數 DialTCP() 時,引數 net 是網路協定名,可以是“tcp”、“tcp4”或“tcp6”。引數 laddr 是本地主機地址,可以設為 nil。引數 raddr 是對方主機地址,必須指定不能省略。函數呼叫成功後,返回 TCPConn 物件;呼叫失敗,返回一個錯誤型別。func (c *TCPConn) Close() error
該方法呼叫成功後,關閉 TCPConn 連線;呼叫失敗,返回一個錯誤型別。// TCP Client端設計 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]) } service := os.Args[1] tcpAddr, err := net.ResolveTCPAddr("tcp", service) checkError(err) conn, err := net.DialTCP("tcp", nil, tcpAddr) checkError(err) rAddr := conn.RemoteAddr() n, err := conn.Write([]byte("Hello server")) checkError(err) n, err = conn.Read(buf[0:]) checkError(err) fmt.Println("Reply form server", rAddr.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) } }編譯並執行伺服器端和用戶端,測試過程如下:
啟動伺服器:go run .main.go
客戶機連線:go run .client.go 127.0.0.1:5000
伺服器響應:Receive from client 127.0.0.1:50813 Hello server
客戶機接收:Reply form server 127.0.0.1:5000 Welcome client
// TCP Server 端設計 package main import( "fmt" "net" "os" ) func main() { service := ":5000" 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) //建立 Goroutine } } func handleClient(conn net.Conn) { defer conn.Close() //逆序呼叫 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 } } } func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error()) os.Exit(1) } }編譯並執行伺服器端和用戶端,測試過程如下、:
啟動伺服器:go run .main.go
客戶機連線:go run .client.go 127.0.0.1:5000
伺服器響應:Receive from client 127.0.0.1:51369 Hello server
客戶機接收:Reply form server 127.0.0.1:5000 Welcome client