2014-01-07 99 views
1

這個想法是通過TCP套接字連接PHP網頁和C程序,以便網頁等待C程序的連接,並在連接建立後立即接收數據。 PHP套接字連接,並接收數據的代碼如下:PHP重複從TCP套接字接收數據

PHP(socketRead.php):

$address = 'localhost'; 
    $port = 5001; 
    if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {  
    echo "Socket creation error"; 
    } 
    else { 
    echo "Socket created <br/>"; 
    } 
    if (($ret = socket_bind($sock, $address, $port)) < 0) { 
    echo "Host/port connection failed"; 
    } 
    else { 
    echo "Host/port connection successful <br/>"; 
    } 
    if (($ret = socket_listen($sock, 5)) < 0) { 
    echo "Socket error"; 
    } 
    else { 
    echo "Waiting connection <br/>"; 
    } 
if (($msgsock = socket_accept($sock)) < 0) { 
     echo "Socket connection start error"; 
    } else { 
     echo "Awaiting data <br/>"; 
    } 
//Connection established, reading data 
    if (false === ($buf = socket_read($msgsock, 1024))) { 
     echo "Read error"; 
    } else { 
     echo "Data: ".$buf; 
    } 
    if (isset($sock)) { 
     socket_close($ret); 
     socket_close($sock); 
    } 
    echo "<br /> Socket closed"; 

要讀取從插座數據動態我使用jquery請求。

使用Javascript(index.html的):

 function update_content() { 
      var request = $.get("socket/socketRead.php"); 
      request.success(function(result) { 
       document.write(result); 
      }); 
     } 
     update_content(); 

偉大的工作,直到我試圖添加的時間間隔重複讀取數據。

使用Javascript(index.html的):

var timer = setInterval(function(){update_content();}, 1000); 

第一連接/接收仍是工作,但後來我在嘗試重新連接時,在C程序中「連接被拒絕」。你能幫我解決這個問題嗎?

+1

*在C程序*「拒絕連接」 - 如你所說,這不是一個問題,PHP PHP :-) socket函數和C使用相同的系統調用,我建議使用'socket_select()'在PHP和C中,也嘗試設置套接字'nonblocking' – DanFromGermany

+1

您的PHP腳本運行一次並終止,它不會在Javascript計時器過去之前再次啓動,並且如果客戶端消失,可能不會再次啓動。真的,你有這個錯誤的方式,C程序(持久實體)應該監聽連接,PHP(臨時實體)應該連接到它。這樣做是要求所有的麻煩,並不會成爲任何生產的可行解決方案。 – DaveRandom

+0

DaveRandom哈哈我甚至沒有注意到.. @PaulPonomarev使用['fsockopen();'](http://php.net/fsockopen)爲PHP連接到C程序 – DanFromGermany

回答

2

你可以使用SSE。

服務器發送活動

https://developer.mozilla.org/en-US/docs/Web/API/EventSource

這不回答你的PHP的問題.. 但SSE它是你正在嘗試做製作。

JS

var sse=new EventSource("sse.php"); 
sse.onmessage=function(e){ 
console.log(e.data) 
}; 

sse.php

function send($data){ 
echo "id: ".time().PHP_EOL; 
echo "data: ".$data.PHP_EOL; 
echo PHP_EOL; 
ob_flush(); // clear memory 
flush(); 
} 

header('Content-Type: text/event-stream'); // specific sse mimetype 
header('Cache-Control: no-cache'); // no cache 
$address='localhost';$port=5001; 

while(true){ 
$msg=($sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP))?'created':'error'; 
send("Socket creation ".$msg); 

$msg=($ret = socket_bind($sock, $address, $port))?'connected':'refused'; 
send("connection ".$msg); 

//.... 
// do the rest 
//..... 

sleep(10); 
} 

注1:不知道,如果PHP語法是正確的,但它只是在這裏給你一個想法。

sse的另一個例子。第二部分也是使用json。

https://stackoverflow.com/a/20689738/2450730

+0

謝謝,SSE真的是我正在尋找的東西 – PaulPonomarev