Go 語言的?
net
?包為網絡編程提供了簡潔高效的接口。我們可以使用它快速構建 TCP 網絡服務,如聊天服務器、RPC、微服務通信等。
一、TCP簡介
TCP(Transmission Control Protocol)是面向連接的、可靠的傳輸協議,通信模型為客戶端-服務端(Client-Server)。
基本流程:
Client?----->?Server(連接)
Client?<---->?Server(數據收發)
Client?-----X?Server(斷開)
二、TCP服務端開發流程
1. 基本步驟
- ? 創建監聽器?
net.Listen("tcp", address)
- ? 接收連接?
ln.Accept()
- ? 啟動協程處理每個連接
2. 示例代碼:簡單回顯服務端
package?mainimport?("bufio""fmt""net"
)func?main()?{ln,?err?:=?net.Listen("tcp",?":8000")if?err?!=?nil?{panic(err)}fmt.Println("Server?is?listening?on?:8000...")for?{conn,?err?:=?ln.Accept()if?err?!=?nil?{fmt.Println("Accept?error:",?err)continue}go?handleConnection(conn)}
}func?handleConnection(conn?net.Conn)?{defer?conn.Close()fmt.Println("Client?connected:",?conn.RemoteAddr())scanner?:=?bufio.NewScanner(conn)for?scanner.Scan()?{msg?:=?scanner.Text()fmt.Println("Received:",?msg)conn.Write([]byte("Echo:?"?+?msg?+?"\n"))}
}
三、TCP客戶端開發流程
1. 基本步驟
- ? 使用?
net.Dial("tcp", address)
?發起連接 - ? 使用?
conn.Write()
?發送數據 - ? 使用?
conn.Read()
?或?bufio.Scanner
?接收響應
2. 示例代碼:簡單回顯客戶端
package?mainimport?("bufio""fmt""net""os"
)func?main()?{conn,?err?:=?net.Dial("tcp",?"localhost:8000")if?err?!=?nil?{panic(err)}defer?conn.Close()fmt.Println("Connected?to?server.")scanner?:=?bufio.NewScanner(os.Stdin)for?{fmt.Print("Input:?")if?!scanner.Scan()?{break}text?:=?scanner.Text()conn.Write([]byte(text?+?"\n"))reply?:=?bufio.NewReader(conn)msg,?_?:=?reply.ReadString('\n')fmt.Print("Server?reply:?"?+?msg)}
}
四、服務端并發處理連接
- ? 每個連接使用?
go handleConnection(conn)
?啟動一個 goroutine。 - ? 利用 channel、sync 等包實現更復雜的控制邏輯。
- ? 避免 goroutine 泄漏,及時關閉連接。
五、進階技巧與注意事項
問題 | 建議 |
粘包/拆包問題 | 采用固定長度協議或使用?\n ?等分隔符協議 |
異常斷開檢測 | 讀取錯誤后及時清理資源 |
超時控制 | 使用?conn.SetDeadline ?設置讀寫超時 |
多客戶端廣播/聊天群 | 使用 map 管理連接池,遍歷發送消息 |
六、實戰小案例:群聊服務端片段
var?clients?=?make(map[net.Conn]string)
var?broadcast?=?make(chan?string)func?main()?{go?broadcaster()//?省略監聽與連接處理...
}func?handleConnection(conn?net.Conn)?{defer?conn.Close()clients[conn]?=?conn.RemoteAddr().String()for?scanner.Scan()?{msg?:=?scanner.Text()broadcast?<-?clients[conn]?+?":?"?+?msg}delete(clients,?conn)
}func?broadcaster()?{for?{msg?:=?<-broadcastfor?conn?:=?range?clients?{fmt.Fprintln(conn,?msg)}}
}
七、總結
- ? TCP 是基礎但強大的通信方式,適用于高可靠性場景。
- ? Go 的并發模型使構建高性能網絡服務變得簡單。
- ? 在生產環境中,還需結合日志、連接池、協議封裝等技術。