golang net包學習筆記

來源:互聯網
上載者:User

標籤:csharp   返回   error   ack   dead   結構體   ext   interface   根據   

閱讀原始碼發現在net包中主要實現了ip、tcp、udp、unix等通訊方式。它們大致可以分成兩大類;其一,ip、udp、unix(DGRAM),這是一些無連結的協議,其二,tcp、unix(STREAM),需要建立連結。net對這兩類協議的使用有一些區別,最明顯的是對於tcp、unix(STEAM)這些協議需要使用一個Listener介面來進行服務端的監聽,

其中每一種通訊方式都使用 xxConn 結構體來表示,諸如IPConn、TCPConn等,這些結構體都實現了Conn介面,Conn介面實現了基本的讀、寫、關閉、擷取遠程和本地地址、設定timeout等功能。

 1 type Conn interface { 2  3     Read(b []byte) (n int, err error) 4  5     Write(b []byte) (n int, err error) 6  7     Close() error 8  9     LocalAddr() Addr10 11     RemoteAddr() Addr12 13     SetDeadline(t time.Time) error14 15     SetReadDeadline(t time.Time) error16 17     SetWriteDeadline(t time.Time) error18 }

1、ip

使用IPConn結構體來表示,它實現了Conn、PacketConn兩種介面。使用如下兩個函數進行Dial和Listen。

 func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error)    func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error)

2、tcp

使用TCPConn結構體來表示,它實現了Conn介面。

使用DialTCP進行Dial操作:

func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)

使用 ListenTCP函數進行Listen,產生一個TCPListener結構體

func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)

使用TCPListener的AcceptTCP方法建立通訊鏈路,得到TCPConn。

3、udp

使用UDPConn介面體來表示,它實現了Conn、PacketConn兩種介面。使用如下兩個函數進行Dial和Listen。

func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error)    func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error)

4、unix

UnixConn實現了Conn、PacketConn兩種介面,其中unix又分為SOCK_DGRAM、SOCK_STREAM。

4.1 對於unix(SOCK_DGRAM),使用如下兩個函數進行Dial和Listen。

func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error)    func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error)

4.2 對於unix(SOCK_STREAM)

用戶端使用DialUnix進行Dial操作

func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error)   

服務端使用ListenUnix函數進行Listen操作,然後使用UnixListener進行AcceptUnix

func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error)

 

5 為了使用方便,golang將一些重複的操作集中到一個函數中。

可以發現上述幾種通訊,都得有Dialxxx、Listenxxx操作,但是根據有無連結,有分成了兩大類,其中一種Listenxxx後直接返回對應的xxxConn,另一種Listenxxx後得到xxxListener,還需要藉助Accepxxx進行擷取xxxConn。所以為了偷懶,又有如下函數:

 

 func ListenPacket(net, laddr string) (PacketConn, error) 

這個函數用於偵聽ip、udp、unix(DGRAM)等協議,返回一個PacketConn介面,同樣根據偵聽的協議不同,這個介面可以包含IPCon、UDPConn、UnixConn等,它們都實現了PacketConn。可以發現與ip、unix(stream)協議不同,直接返回的是xxConn,不是間接的通過Listener進行Accept操作後,才得到一個Conn。

 

 func Listen(net, laddr string) (Listener, error)

這個函數用於偵聽tcp、unix(stream)等協議,返回一個Listener介面、根據偵聽的協議不同,這個介面可以包含TCPListener、UnixListener等,它們都實現了Listener介面,然後通過調用其Accept方法可以得到Conn介面,進行通訊。

 

 

 func Dial(network, address string) (Conn, error)

這個函數對於所有的協議都是相同的操作,返回一個Conn介面,根據協議的不同實際上包含IPConn、UDPConn、UnixConn、IPConn,它們都實現了Conn介面

golang net包學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.