首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP从TCP套接字中反复接收数据

问PHP从TCP套接字中反复接收数据
EN

Stack Overflow用户
提问于 2014-01-07 15:20:51
回答 1查看 4.2K关注 0票数 1

其思想是通过TCP套接字连接PHP网页和C程序,使网页等待C程序的连接,并在连接建立后立即接收数据。PHP套接字连接和数据接收的代码如下:

PHP(socketRead.php):

代码语言:javascript
复制
 $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):

代码语言:javascript
复制
        function update_content() {
            var request = $.get("socket/socketRead.php");
            request.success(function(result) {
                document.write(result);
            });
        }
        update_content();

在我试图添加间隔以反复读取数据之前,工作非常出色。

Javascript(index.html):

代码语言:javascript
复制
var timer = setInterval(function(){update_content();}, 1000);

第一个连接/接收仍然有效,但是当我再次尝试连接时,我在C程序中被“拒绝连接”。你能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 15:38:57

你可以用SSE做这个。

服务器发送事件

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

这并不能回答您的php问题。但是SSE是为你想要做的事而做的。

js

代码语言:javascript
复制
var sse=new EventSource("sse.php");
sse.onmessage=function(e){
 console.log(e.data)
};

sse.php

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20975314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档