我嘗試創建 TCP 客戶端以從 TCP 服務器接收數據,但是在服務器發送數據后,即使服務器發送很多數據,我也只收到一個數據,我想永遠接收數據,我不知道我的問題是什么,并且客戶:func main() { tcpAddr := "localhost:3333" conn, err := net.DialTimeout("tcp", tcpAddr, time.Second*7) if err != nil { log.Println(err) } defer conn.Close() // conn.Write([]byte("Hello World")) connBuf := bufio.NewReader(conn) for { bytes, err := connBuf.ReadBytes('\n') if err != nil { log.Println("Rrecv Error:", err) } if len(bytes) > 0 { fmt.Println(string(bytes)) } time.Sleep(time.Second * 2) }}我按照這個例子來創建 TCP 測試服務器服務器:// Handles incoming requests.func handleRequest(conn net.Conn) { // Make a buffer to hold incoming data. buf := make([]byte, 1024) // Read the incoming connection into the buffer. _, err := conn.Read(buf) if err != nil { fmt.Println("Error reading:", err.Error()) } fmt.Println(buf) // Send a response back to person contacting us. var msg string fmt.Scanln(&msg) conn.Write([]byte(msg)) // Close the connection when you're done with it. conn.Close()}
1 回答

阿晨1998
TA貢獻2037條經驗 獲得超6個贊
讀取需要在連接的另一端進行寫入
想永遠接收數據
然后你必須永遠發送數據。接收端有for
環路,發送端沒有環路。服務器寫入一次消息并關閉連接。
服務器希望從客戶端獲取消息,但客戶端不發送
// conn.Write([]byte("Hello World"))
那應該為msg
服務器提供價值
_, err := conn.Read(buf)
所以這兩行不匹配。
客戶端需要一個換行符,但服務器沒有發送一個
fmt.Scanln
期望將每個空格分隔的值放入相應的參數中。它不捕獲空格。所以:
只有您在服務器標準輸入中輸入的第一個空格才會存儲在
msg
換行符不會存儲在
msg
.
但是你的客戶正在做
bytes, err := connBuf.ReadBytes('\n')
\n
永遠不會來。客戶永遠不會先讀完那篇文章msg
。
bufio.NewScanner
將是從 stdin 收集數據的更好方法,因為您可能也想捕獲空格。不要忘記將換行符附加到您發送的每一行文本,因為客戶需要它!
工作代碼
我將這些更改放在操場上的一個工作示例中。為了讓它在這種情況下工作,我還必須進行一些其他更改。
在同一進程中運行服務器和客戶端
硬編碼 3 個客戶端,因此程序在有限的時間內結束
硬編碼 10 在客戶端接收所以程序可以結束
處理了硬編碼的 3 個服務器連接,以便程序可以結束
刪除
fmt.Scanln
并讓服務器返回發送的原始消息(因為游樂場不提供標準輸入機制)
應該足以讓你開始。
- 1 回答
- 0 關注
- 120 瀏覽
添加回答
舉報
0/150
提交
取消