2015-04-30 151 views
-2

我试图通过套接字与Go和PHP进行通信。使用代码IM是:PHP/Go套接字通信

转到:

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); 

的问题是,转到服务器总是在认为它接收的东西所有的时间,所以它打印“消息收到: “不断。如果我这样做(消息!=“”)它有点作品,但CPU使用率很高。

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

+3

bufio.Reader.Readstring返回一个你没有检查的错误。 – thwd

+0

如果我检查错误说“E0F” – user3713080

+0

永远不要忽略错误。不要在循环中每次迭代创建一个新的'bufio.Reader'!处理'io.EOF'。 –

回答

1

documentationReadString说:

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

这意味着你得到io.EOF(表示没有更多的数据要从连接中读取)和一个空字符串。

如果您希望在没有数据可用时阻止ReadString,请不要使用bufio,而是直接从连接中读取数据。

参见:documentationnet.Conn

的另一个问题是,服务器没有收到 “测试” 除非我注释掉socket_read($插槽,4);在PHP中。

这描述heresocket_write缓冲器:

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

使用

fflush($socket); 

写操作后。

+0

您对关于“阻止”和“bufio”的评论对我毫无意义。需要''bufio.ReadString'块。 –