2 回答

TA貢獻1869條經驗 獲得超4個贊
有沒有一種方法可以在新消息到達 net.conn 時通知 net.conn 而不是使用 for 循環?
不,不在標準包中。
在循環中從 net.Conn 讀?。ǎ┦菣z測消息到達的常用方法。如果您需要執行多個并發任務,您可以將循環封裝在一個寫入通道的 goroutine 中,并包裝一個 for 循環和 select around 從該通道讀取。

TA貢獻1784條經驗 獲得超2個贊
net.conn.Read自動阻塞,直到連接上的數據可用。您不必循環等待數據出現。
有一個簡單的套接字服務器(在 python3 中只是為了清除語言障礙)
import socket, os, sys
addr='/tmp/a_unix_socket'
if os.path.exists(addr):
os.unlink(addr)
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind(addr)
sock.listen(1)
while True:
print("Waiting for connection", file=sys.stderr)
conn, client_addr = sock.accept()
data =conn.recv(128)
print("Recived {}".format(data))
conn.sendall(b'thank you')
conn.close()
我可以這樣制作一個 golang 客戶端:
package main
import (
"net"
"fmt"
)
func main() {
conn, err := net.Dial("unix", "/tmp/a_unix_socket")
if err != nil {
panic(err)
}
conn.Write([]byte("here is data"))
result := make([]byte, 128)
_, err = conn.Read(result)
if err != nil {
panic(err)
}
fmt.Println("Response: ", string(result))
conn.Close()
}
服務器端說:
$ python3 ./t.py
Waiting for connection
Recived b'here is data'
Waiting for connection
客戶端說:
$ go run t.go
Response: thank you
net.Conn此處未配置讀取超時,因此它愿意等待所需的時間。
我還要提一下:
if err != nil {
return false
}
這隱藏了無區別的“錯誤”響應背后的錯誤。如果發生不可恢復的錯誤(比方說服務器關閉連接),您的客戶端將無限期循環(在此過程中占用大量 CPU)。如果您需要暴露錯誤,請返回它們。如果您想偷懶進行概念驗證,panic()如果必須的話,可以使用它們,但不要為所有這些返回相同的結果,否則您將無法正確處理個別錯誤情況。在您的情況下,這是一個有爭議的問題,因為您for無論如何都不需要循環。
- 2 回答
- 0 關注
- 193 瀏覽
添加回答
舉報