標籤: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