Go語言學習筆記(六)net

來源:互聯網
上載者:User

標籤:type   工作   定時   一個   golang   end   ==   break   style   

加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959

net

import "net"

net包提供了可移植的網路I/O介面,包括TCP/IP、UDP、網域名稱解析和Unix域socket。

雖然本包提供了對網路原語的訪問,大部分使用者只需要Dial、Listen和Accept函數提供的基本介面;以及相關的Conn和Listener介面。crypto/tls包提供了相同的介面和類似的Dial和Listen函數。

 

Listen函數建立的服務端:

ln, err := net.Listen("tcp", ":8080")if err != nil {    // handle error}for {    conn, err := ln.Accept()    if err != nil {        // handle error        continue    }    go handleConnection(conn)}

Dial函數和服務端建立串連:

conn, err := net.Dial("tcp", "google.com:80")if err != nil {    // handle error}fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")status, err := bufio.NewReader(conn).ReadString(‘\n‘)// ...

 

TCPConn

TCPConn代表一個TCP網路連接,實現了Conn介面。

Conn介面

Conn介面代表通用的面向流的網路連接。多個線程可能會同時調用同一個Conn的方法。

type Conn interface {    // Read從串連中讀取資料    // Read方法可能會在超過某個固定時間限制後逾時返回錯誤,該錯誤的Timeout()方法返回真    Read(b []byte) (n int, err error)    // Write從串連中寫入資料    // Write方法可能會在超過某個固定時間限制後逾時返回錯誤,該錯誤的Timeout()方法返回真    Write(b []byte) (n int, err error)    // Close方法關閉該串連    // 並會導致任何阻塞中的Read或Write方法不再阻塞並返回錯誤    Close() error    // 返回本網地址    LocalAddr() Addr    // 返回遠端網路地址    RemoteAddr() Addr    // 設定該串連的讀寫deadline,等價於同時調用SetReadDeadline和SetWriteDeadline    // deadline是一個絕對時間,超過該時間後I/O操作就會直接因逾時失敗返回而不會阻塞    // deadline對之後的所有I/O操作都起效,而不僅僅是下一次的讀或寫操作    // 參數t為零值表示不設定期限    SetDeadline(t time.Time) error    // 設定該串連的讀操作deadline,參數t為零值表示不設定期限    SetReadDeadline(t time.Time) error    // 設定該串連的寫操作deadline,參數t為零值表示不設定期限    // 即使寫入逾時,傳回值n也可能>0,說明成功寫入了部分資料    SetWriteDeadline(t time.Time) error}

 

栗子一tcp服務端 
package mainimport (    "fmt"    "net")func process(conn net.Conn) {    defer conn.Close()    for {        buf := make([]byte, 512)        n, err := conn.Read(buf)        if err != nil {            fmt.Println("read err:", err)            return        }        fmt.Println("read:", string(buf[:n]))    }}func main() {    fmt.Println("server start...")    listen, err := net.Listen("tcp", "0.0.0.0:8000")    if err != nil {        fmt.Println("listen failed, err:", err)        return    }    for {        conn, err := listen.Accept()        if err != nil {            fmt.Println("accept failed, err:", err)            continue        }        go process(conn)    }}

 

tcp用戶端
package mainimport (    "bufio"    "fmt"    "net"    "os"    "strings")func main() {    conn, err := net.Dial("tcp", "localhost:8000")    if err != nil {        fmt.Println("err dialing:", err.Error())        return    }    defer conn.Close()    inputReader := bufio.NewReader(os.Stdin)    for {        input, _ := inputReader.ReadString(‘\n‘)        trimedInput := strings.Trim(input, "\r\n")        if trimedInput == "Q" {            return        }        _, err := conn.Write([]byte(trimedInput))        if err != nil {            fmt.Println("err conn.write:", err)            return        }    }}

 

栗子二(http)

封裝一個http串連,請求百度

package mainimport (    "fmt"    "io"    "net")func main() {    conn, err := net.Dial("tcp", "www.baidu.com:80")    if err != nil {        fmt.Println("err dialing:", err.Error())        return    }    defer conn.Close()    msg := "GET / HTTP/1.1\r\n"    msg += "Host: www.baidu.com\r\n"    msg += "Connection: close\r\n"    // msg += "Connection: keep-alive\r\n"    msg += "\r\n\r\n"    _, err = io.WriteString(conn, msg)    if err != nil {        fmt.Println("io write string failed, err:", err)        return    }    buf := make([]byte, 4096)    for {        count, err := conn.Read(buf)        if err != nil {            break        }        fmt.Println(string(buf[:count]))    }}

 

Appendix大端位元組序的實現
    data, err := json.Marshal("hello world")    if err != nil {        return    }    var buf [4]byte    packLen := uint32(len(data))    fmt.Println("packlen:", packLen)    // 前4個位元組表示data大小    binary.BigEndian.PutUint32(buf[0:4], packLen)    n, err := conn.Write(buf[:])    if err != nil || n != 4 {        fmt.Println("write data  failed")        return    }    _, err = conn.Write([]byte(data))    if err != nil {        return    }

 

Go語言學習筆記(六)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.