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

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

向 TCP 服務器發送多個請求失敗

向 TCP 服務器發送多個請求失敗

Go
胡子哥哥 2023-07-10 10:52:31
我試圖向 Go 中的 TCP 服務器發送多個請求,但由于某種原因,第二個請求從未發送,即使它與第一個請求相同。這是服務器:func StartServer(host string) {    l, err := net.Listen("tcp", host)    log.Println("Starting server on:", host)    if err != nil {        fmt.Println(err)        os.Exit(1)    }    defer l.Close()    log.Println("Server is running...")    for {        // Listen for an incoming connection.        conn, err := l.Accept()        if err != nil {            log.Fatal("Error accepting: ", err.Error())        }        // Handle connections in a new goroutine.        fmt.Println("got a request")        go handleRequest(conn)    }}這是客戶端中將請求發送到服務器的函數:func (u *User) ConnectToServer(host string, partner string) {    conn, _ := net.Dial("tcp", host)    fmt.Fprintf(conn, "message1\n")    fmt.Fprintf(conn, "message2\n")}編輯:在handleRequest函數中我讀取輸入如下: // Handles incoming requests.func handleRequest(conn net.Conn) {    rec, err := bufio.NewReader(conn).ReadString('\n')    if err != nil {        log.Println("Error reading:", err.Error())    }    log.Println("Got message: ", rec)    // Send a response back to person contacting us.    conn.Write([]byte("Message received."))    // conn.Close()}根據文檔,在檢測到第一個換行符之前僅采用第一部分,因此我相信第二條消息因此被忽略。我怎樣才能閱讀這兩條消息?我應該更改客戶端中的分隔符嗎?
查看完整描述

2 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

鑒于客戶端發送多行,服務器應該讀取多行。使用bufio.Scanner讀取行:


func handleRequest(conn net.Conn) {

? ?defer conn.Close()

? ?scanner := bufio.NewScanner(conn)

? ?for scanner.Scan() {

? ? ? fmt.Printf("Got message: %s\n", scanner.Bytes())

? ? ? conn.Write([]byte("Message received."))

? ?}

? ?if err := scanner.Err(); err != nil {

? ? ? fmt.Printf("error reading connection: %v\n", err)

? ?}

}

關于代碼的一些注釋:


為了防止資源泄漏,該函數在返回時關閉連接。

掃描儀循環因讀取連接錯誤而中斷。如果錯誤不是 io.EOF,則該函數會記錄該錯誤。

bufio.Reader也可以用來讀取行,但是 bufio.Scanner 更容易使用。


查看完整回答
反對 回復 2023-07-10
?
拉丁的傳說

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

在 中handleRequest(),您調用ReadString()bufio Reader。讓我們看一下文檔:

ReadString 讀取直到輸入中第一次出現 delim,返回包含分隔符之前的數據的字符串。如果 ReadString 在找到分隔符之前遇到錯誤,它將返回錯誤之前讀取的數據以及錯誤本身(通常是 io.EOF)。當且僅當返回的數據不以 delim 結尾時,ReadString 返回 err != nil。對于簡單的使用,掃描儀可能更方便。

考慮到您發送的數據包以 終止,您必須在同一個讀取器上\n調用兩次。ReadString()您可能希望ReadString()循環調用,直到返回錯誤。io.EOF那么一定要分清楚。

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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