PHP / Go сокетная связь

Я пытаюсь общаться между 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.

-2

Решение

документация за ReadString говорит:

Если ReadString обнаруживает ошибку перед поиском разделителя, он возвращает данные, прочитанные до ошибки, и саму ошибку (часто io.EOF).

Это означает, что вы получаете io.EOF (указывает на то, что больше нет данных для чтения из соединения) и пустой строки.

Если вы хотите заблокировать ReadString, когда данные недоступны, не используйте bufio а лучше читать прямо из соединения.

Смотрите также: документация за net.Conn

Другая проблема заключается в том, что сервер не получает «тест», если я не закомментирую socket_read ($ socket, 4); в PHP.

Это описано Вот, socket_write буферы:

socket_write () не обязательно записывает все байты из данного буфера. […]

использование

fflush($socket);

после записи.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]