2015-04-30 149 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'塊。 –