慕的地8271018
2022-09-19 14:58:39
這個無限的for循環如何不崩潰?我想如果現在沒有客戶,請傾聽。Accept() 方法拋出一個錯誤,使 if 條件為 true,并且 for 循環繼續到另一個迭代,直到客戶端連接到服務器。因此,我放入if語句,看看它是否像我猜測的那樣工作。但事實并非如此。它沒有打印“錯誤”,因此當沒有客戶端時,程序不會進入if語句。fmt.Println("Error")有人可以解釋一下這個for循環是如何工作的嗎?func main() { service := ":1202" tcpAddr, err := net.ResolveTCPAddr("tcp4", service) checkError(err) listener, err := net.ListenTCP("tcp4", tcpAddr) checkError(err) for { conn, err := listener.Accept() if err != nil { fmt.Println("Error") continue } } }
1 回答

ibeautiful
TA貢獻1993條經驗 獲得超6個贊
這個無限循環是執行以下操作:
等待 返回,并顯示新連接或錯誤。
listener.Accept()
如果收到返回值,請檢查錯誤。如果你有一個,記錄它,或對它做任何事情,然后循環,以便服務器可以等待另一個新連接。
continue
如果您沒有錯誤,只需啟動一個單獨的go例程即可處理連接。這樣,for 循環會立即再次運行,因此偵聽器將等待新連接,而您在單獨的例程中處理該連接。
請參閱示例:
func main() {
service := ":1202"
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
checkError(err)
listener, err := net.ListenTCP("tcp4", tcpAddr)
checkError(err)
for {
conn, err := listener.Accept()
if err != nil {
log.Println("We've got an error:",err)
continue
}
go HandleConnection(conn)
}
}
添加回答
舉報
0/150
提交
取消