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
}
Это скрывает ошибки за незаметными «ложными» ответами.В случае неустранимой ошибки (скажем, закрытое соединение с сервером) ваш клиент будет бесконечно зацикливаться (перегружая процессор).Если вам нужно выявить ошибки, верните их.Если вы хотите быть ленивым в доказательстве концепции, наберите panic()
их, если нужно, но не возвращайте одинаковый результат для всех из них, иначе вы не сможете правильно обрабатывать отдельные случаи ошибок.В вашем случае это своего рода спорный вопрос, поскольку вам все равно не нужен цикл for
.