當前位置:
首頁 > 知識 > Go語言學習筆記(六)net

Go語言學習筆記(六)net

加 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

")
status, err := bufio.NewReader(conn).ReadString("
")
// ...

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 main

import (
"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 main

import (
"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("
")
trimedInput := strings.Trim(input, "
")
if trimedInput == "Q" {
return
}
_, err := conn.Write(byte(trimedInput))
if err != nil {
fmt.Println("err conn.write:", err)
return
}
}
}

栗子二(http)

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

package main

import (
"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
"
msg += "Host: www.baidu.com
"
msg += "Connection: close
"
// msg += "Connection: keep-alive
"
msg += "

"

_, 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
}

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

MySQL日期、時間相關內容
goroutine 加 channel 代替遞歸調用,突破遞歸調用的層級限制
WPF——TextBlock的ToolTip附加屬性
設計模式解密(17)- 備忘錄模式
php nginx反向代理

TAG:達人科技 |

您可能感興趣

Python語言學習路線圖
Go 語言範圍(Range)
Go 語言切片(Slice)
語言學文學期刊推薦:De Gruyter語言學文學電子期刊集
Keener_Tic_Tac_Toe(井字棋遊戲)代碼(c語言)
vscode寫c語言(windows)
Canonical宣布Kotlin編程語言Snap包格式上線
R語言攜手TensorFlow進軍深度學習
三星Galaxy note9曝光 沿用note系列設計語言 依然保留S-PEN
再見 Python!Yann LeCun 警告:深度學習需要新編程語言
再見Python!Yann LeCun警告:深度學習需要新編程語言
iOS版本的Rosetta Stone添加AR+AI語言學習功能
關於C語言中的scanf()函數
Julia:集Python、C+、R等語言為一體的全新語言
攝影|Bruno Barbey:世界通用語言
大師語言 | John William Godward
Dotdot:物聯網的語言
用R語言的Blogdown+Hugo+Netlify+Github建博客
IEEE Spectrum發布語言排名:Python第一
《The Room:Old Sins》多語言版本展開事前註冊