PHP反复从TCP套接字接收数据

Posted

技术标签:

【中文标题】PHP反复从TCP套接字接收数据【英文标题】:PHP receiving data from TCP socket repeatedly 【发布时间】:2014-01-07 15:20:51 【问题描述】:

这个想法是通过TCP套接字连接php网页和C程序,该网页等待来自C程序的连接并在连接建立后立即接收数据。 PHP socket连接和数据接收代码如下:

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 程序中收到“连接被拒绝”。你能帮我解决这个问题吗?

【问题讨论】:

C 程序中的“连接被拒绝” - 正如你所说,这不是 PHP 问题 :-) PHP 套接字函数和 C 使用相同的系统调用,我建议使用socket_select() 在 PHP 和 C 中,也尝试设置套接字 nonblocking 您的 PHP 脚本运行一次并终止,在 Javascript 计时器结束之前不会再次启动,并且如果客户端离开,则可能根本不会再次启动。真的你有这个错误的方式,C程序(持久实体)应该正在监听连接,而PHP(临时实体)应该连接到它。这样做会带来各种麻烦,并且不会成为生产中任何事情的可行解决方案。 DaveRandom 哈哈,我什至没有注意到.. @PaulPonomarev 使用 fsockopen(); 连接到 C 程序的 php 我不能使用 C 程序作为侦听器,因为它有更多动态的事情要做,而网页仅用于可视化来自 C 程序的数据。在 C 中监听套接字将停止所有程序,直到客户端出现 如果你使用带有socket_select() 的非阻塞套接字,程序将不会停止(等待客户端)。还要考虑多线程/分叉/多进程c服务器 【参考方案1】:

您可以为此使用 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);

note1:不确定php语法是否正确,但它只是在这里给你一个想法。

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

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

【讨论】:

谢谢,SSE 确实是我正在寻找的东西

以上是关于PHP反复从TCP套接字接收数据的主要内容,如果未能解决你的问题,请参考以下文章

在 ICMP 套接字上接收数据

缓冲读取器未从套接字接收数据

TCP Socket在C#中接收数据错误

从带有 ASCII 数据包大小标头的 Erlang 活动模式的套接字接收数据包

性能通过 TCP 套接字客户端-服务器应用程序发送/接收数据

Python 3套接字客户端发送数据和C++套接字服务器接收偏移数据?