Я пытаюсь общаться между Go и PHP с сокетом. Код, который я использую:
Идти:
fmt.Println("Launching server...")
ln, _ := net.Listen("tcp", ":8080")
conn, _ := ln.Accept()
for {
message, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Print("Message Received:", string(message))
conn.Write([]byte("test" +"\n"))
}
PHP:
$address = gethostbyaddr($ip);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket === false){
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error());
}
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket));
}
socket_write($socket, "test", 4);
socket_read($socket, 4);
Проблема в том, что сервер Go постоянно думает, что что-то получает, поэтому постоянно печатает сообщение «Получено:». Если я делаю if (message! = «»), Это вроде работает, но использование процессора велико.
Другая проблема заключается в том, что сервер не получает «тест», если я не закомментирую socket_read ($ socket, 4); в PHP.
документация за ReadString
говорит:
Если ReadString обнаруживает ошибку перед поиском разделителя, он возвращает данные, прочитанные до ошибки, и саму ошибку (часто io.EOF).
Это означает, что вы получаете io.EOF
(указывает на то, что больше нет данных для чтения из соединения) и пустой строки.
Если вы хотите заблокировать ReadString, когда данные недоступны, не используйте bufio
а лучше читать прямо из соединения.
Смотрите также: документация за net.Conn
Другая проблема заключается в том, что сервер не получает «тест», если я не закомментирую socket_read ($ socket, 4); в PHP.
Это описано Вот, socket_write
буферы:
socket_write () не обязательно записывает все байты из данного буфера. […]
использование
fflush($socket);
после записи.
Других решений пока нет …