亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

簡單的服務器客戶端通信不起作用

簡單的服務器客戶端通信不起作用

Go
ibeautiful 2023-07-17 16:34:53
這個看似簡單的例子并沒有按預期工作,我覺得問這個問題很糟糕,但這里是:有一個客戶端重試連接到服務器,發送消息,然后等待響應:func client() {    var conn net.Conn    var err error    // retry server until it is up    for {        conn, err = net.Dial("tcp", ":8081")        if err == nil {            break        }        log.Println(err)        time.Sleep(time.Second)    }    // write to server    _, err = conn.Write([]byte("request"))    if err != nil {        log.Println(err)        return    }    // block & read from server    var buf []byte    n, err := conn.Read(buf)    if err != nil {        log.Println(err)        return    }    log.Printf("From server: %s\n", buf[:n])}它連接到一個服務器,該服務器對于每個連接,讀取并解釋發送的數據,并在需要時發送響應:func server() {    ln, _ := net.Listen("tcp", ":8081")    for {        conn, _ := ln.Accept()        go handleConn(conn)    }}func handleConn(conn net.Conn) {    var buf []byte    n, err := conn.Read(buf)    if err != nil {        return    }    log.Printf("Server got: %s\n", buf)    if string(buf[:n]) == "request" {        _, _ = conn.Write([]byte("response"))    }}全部由main函數驅動:func main() {    go client()    server()}為了簡潔起見,省略了錯誤處理。預期的行為是客戶端將連接到服務器并發送消息“請求”,然后阻止讀取。服務器接收“請求”并將消息“響應”發送回同一連接??蛻舳私怄i,打印收到的消息并退出。相反,當程序運行時,會打印以下內容:2019/09/01 22:24:02 From server: 2019/09/01 22:24:02 Server got: 表明沒有數據交換,并且客戶端沒有阻塞。
查看完整描述

1 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

客戶端的循環很奇怪!如果讀/寫已結束,則循環沒有意義。但錯誤只是這樣:


  //var buf []byte <--- this read 0 bytes

  buf := make([]byte, 1024) 

  n, err := conn.Read(buf)

給您的建議:


package main


import (

    "log"

    "net"

    "time"

)


func client() {

    var conn net.Conn

    var err error


    // retry server until it is up

    for {

        log.Printf("Connecting...")

        conn, err = net.Dial("tcp", ":8082")

        if err != nil {

            log.Println(err)

            break

        }

        time.Sleep(time.Second)

        // write to server

        log.Printf("Writing...")

        _, err = conn.Write([]byte("request"))

        if err != nil {

            log.Println(err)

            return

        }

        // block & read from server

        log.Printf("Reading...")

        var buf []byte

        n, err := conn.Read(buf)

        if err != nil {

            log.Println(err)

            return

        }

        log.Printf("From server: %s\n", buf[:n])

    }

}


func server() {

    ln, _ := net.Listen("tcp", ":8082")

    for {

        conn, _ := ln.Accept()

        go handleConn(conn)

    }

}


func handleConn(conn net.Conn) {

    buf := make([]byte, 1024)

    n, err := conn.Read(buf)

    if err != nil {

        return

    }

    log.Printf("Server got: [%d bytes] %s\n", n, buf)


    if string(buf[:n]) == "request" {

        _, _ = conn.Write([]byte("response"))

    }

    conn.Close()

}


func main() {

    go client()

    server()

}



查看完整回答
反對 回復 2023-07-17
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號