PHP / Go套接字通信

时间:2015-04-30 09:01:58

标签: php sockets 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服务器一直认为它一直在接收内容,所以它不断打印“Message Recieved:”。如果我这样做(消息!=“”)它有点工作,但CPU使用率很高。

另一个问题是服务器没有收到“test”,除非我注释掉socket_read($ socket,4);用PHP。

1 个答案:

答案 0 :(得分:1)

ReadString的{​​{3}}说:

  

如果ReadString在找到分隔符之前遇到错误,它会返回错误前读取的数据和错误本身(通常是io.EOF)。

这意味着您将获得io.EOF(表示没有更多数据可以从连接中读取)和空字符串。

如果您想在没有可用数据的情况下阻止ReadString,请不要使用bufio,而是直接从连接中读取。

另请参阅:net.Conn

documentation
  

另一个问题是服务器没有收到“test”,除非我注释掉socket_read($ socket,4);用PHP。

这描述了documentationsocket_write缓冲区:

  

socket_write()不一定写入给定缓冲区中的所有字节。 [...]

使用

fflush($socket);
写完后