2014-01-07 2 views
1

Идея состоит в том, чтобы связать веб-страницу PHP и программу C через TCP-сокет, чтобы эта веб-страница ожидала соединения с программой C и получала данные сразу же после установления соединения. Код связи РНР сокета и приема данных ниже:PHP, получающий данные из сокета TCP повторно

РНР (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); 

Первое соединение/получающее все еще работает, но тогда я получаю "Connection отказался" в программе C при попытке подключиться снова. Можете ли вы помочь мне с этой проблемой?

+1

* «В соединении отказано» в программе C * - как вы сказали, это не PHP вопрос :-) функции сокетов PHP и C используют одни и те же системные вызовы, и я предлагаю использовать 'socket_select()' как в PHP, так и в C, попробуйте установить сокет 'nonblocking' – DanFromGermany

+1

Ваш PHP-скрипт запускается один раз и завершается, он не запускается снова до тех пор, пока не истечет время Javascript, и может не запускаться снова вообще, если клиент уходит. На самом деле у вас это неправильно, программа C (постоянная сущность) должна прослушивать соединения, а PHP (временная сущность) должен быть подключен к ней. Делать это так круглый просят всевозможные проблемы и не будет жизнеспособным решением для чего-либо в производстве. – DaveRandom

+0

DaveRandom lol Я даже не заметил, что .. @PaulPonomarev использует ['fsockopen();'] (http://php.net/fsockopen) для подключения php к программе C – DanFromGermany

ответ

2

Вы можете использовать SSE для этого.

сервера Sent Events

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

Note1: Не уверен, что если синтаксис PHP является правильным, но это только здесь, чтобы дать вам идею.

Другой пример sse .. Вторая часть также использует json.

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

+0

Спасибо, SSE действительно то, что я искал – PaulPonomarev

Смежные вопросы