<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 簡介 網絡的socket數據傳輸是一種特殊的I/O,socket也是一種文件描述符.socket也具有一個類似打開文件的函數調用:socket(),該函數返回有一個整形的socket描述符,隨后的連接建立,數據傳輸等操作都是通過它實現的 常用的socket類型有兩種:流式socket(`SOCK_STREAM`)和數據報式socket(`SOCK_DGRAM`) * 流式是一種面向連接的socket,針對面向連接的tcp服務應用 * 數據報式socket是一種無連接的socket,對應于無連接的udp服務應用 ![](https://box.kancloud.cn/d237f0f03353c1401e665eea53e5040f_1190x1260.png) **listen創建的socket不用于通信,用于監聽地址的,accept的socket是用來通信的** ![](https://box.kancloud.cn/2076d9f847b34c6783e6c6fb538553cf_1203x440.png) 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() error Addr() Addr } ~~~ Conn接口 ~~~ type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) (n int, err error) Close() error LocalAddr() Addr RemoteAddr() Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(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]))) //因為客戶端傳遞來的有\n if "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])) } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看