日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的socket

發布時間:2025/6/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的socket 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

網絡的socket數據傳輸是一種特殊的I/O,socket也是一種文件描述符.socket也具有一個類似打開文件的函數調用:socket(),該函數返回有一個整形的socket描述符,隨后的連接建立,數據傳輸等操作都是通過它實現的

常用的socket類型有兩種:流式socket(SOCK_STREAM)和數據報式socket(SOCK_DGRAM)

  • 流式是一種面向連接的socket,針對面向連接的tcp服務應用
  • 數據報式socket是一種無連接的socket,對應于無連接的udp服務應用


listen創建的socket不用于通信,用于監聽地址的,accept的socket是用來通信的

read讀服務/客戶,有返回0,對端關閉和你連接了

函數

server端
Listen函數

func Listen(network, address string) (Listener, error)

network:tcp或者udp
address:ip端口號比如127.0.0.1:9194或者:8005

Listener接口

type Listener interface {Accept() (Conn, error)Close() errorAddr() Addr }

Conn接口

type Conn interface {Read(b []byte) (n int, err error)Write(b []byte) (n int, err error)Close() errorLocalAddr() AddrRemoteAddr() AddrSetDeadline(t time.Time) errorSetReadDeadline(t time.Time) errorSetWriteDeadline(t time.Time) error }

tcp服務代碼

func main() {listener, err := net.Listen("tcp", "0.0.0.0:8183")if err != nil {fmt.Println("err = ", err)return}//退出前把監聽關閉defer listener.Close()//阻塞等待用戶鏈接for {conn, err := listener.Accept()if err != nil {fmt.Println("err = ", err)continue}//接收用戶的請求//1024緩沖區buf := make([]byte, 1024)n, err1 := conn.Read(buf)if err1 != nil {fmt.Println("err1 = ", err1)continue}fmt.Println("buf = ", string(buf[:n]))//關閉當前用戶的連接defer conn.Close()} }

tcp客戶端

func main() {conn, err := net.Dial("tcp", "127.0.0.1:8183")if err != nil {fmt.Println("err = ", err)return}defer conn.Close()//發送數據conn.Write([]byte("are u ok?")) }

服務端多人

用nc做客戶端,telnet做客戶端好像會多傳東西

func HandleConn(conn net.Conn) {//獲取客戶端的網絡地址信息addr := conn.RemoteAddr().String()fmt.Println("連接成功: ", addr)//關閉連接defer conn.Close()buf := make([]byte, 2048)for {//讀取用戶數據,如果客戶端關閉了,好像是能發現這邊的n是等于0的n, err := conn.Read(buf)if err != nil {//客戶端意外關閉,也能發現fmt.Println("err = ", err)return}//打印數據fmt.Println("數據是: ", string(buf[:n]))//看里面多了哪些東西fmt.Println("長度是: ", len(string(buf[:n])))//因為客戶端傳遞來的有\nif "exit" == string(buf[:n-1]) {fmt.Println(addr, " exit")return}//把數據轉化為大寫再發送conn.Write([]byte(strings.ToUpper(string(buf[:n]))))} }func main() {listener, err := net.Listen("tcp", "0.0.0.0:8183")if err != nil {fmt.Println("err = ", err)return}//退出前把監聽關閉defer listener.Close()//阻塞等待用戶鏈接for {conn, err := listener.Accept()if err != nil {fmt.Println("err = ", err)return}//處理用戶請求go HandleConn(conn)} }

可輸入回復客戶端

func main() {conn, err := net.Dial("tcp", "127.0.0.1:8183")if err != nil {fmt.Println("net.Dial err = ", err)return}//main調用完畢,關閉連接defer conn.Close()//接收服務器回復的數據go func() {//從鍵盤輸入內容,給服務器發送內容str := make([]byte, 1024)for {n, err := os.Stdin.Read(str)if err != nil {fmt.Println("錯誤信息是: ", err)return}//把輸入的內容發給服務器conn.Write(str[:n])}}()//切片緩沖buf := make([]byte, 1024)for {//如果服務端關閉和你連接,這邊的n是能讀取到0的n, err := conn.Read(buf)if err != nil {fmt.Println("錯誤信息是: ", err)return}fmt.Println(string(buf[:n]))} }

總結

以上是生活随笔為你收集整理的golang中的socket的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。