2015-04-30 5 views
-2

Im пытается связываться между Go и PHP с помощью сокета. Код им с помощью является:PHP/Go socket communication

Перейти:

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.

+3

bufio.Reader.Readstring возвращает ошибку, которую вы не проверяете. – thwd

+0

Если я проверяю ошибку, это говорит «E0F» – user3713080

+0

Никогда не игнорируйте ошибки. Не создавайте новую «bufio.Reader» каждую итерацию через цикл! Ручка 'io.EOF'. –

ответ

1

documentation для ReadString говорит:

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

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

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

Смотрите также: documentation для net.Conn

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

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

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

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

fflush($socket); 

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

+0

Ваш комментарий о блокировке и 'bufio' не имеет для меня никакого смысла. 'bufio.ReadString' блокируется как требуется. –