gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:41:35 24 4
gpt4 key购买 nike

想法是通过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 程序中出现“连接被拒绝”。你能帮我解决这个问题吗?

最佳答案

您可以为此使用 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://stackoverflow.com/a/20689738/2450730

关于javascript - PHP 反复从 TCP 套接字接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com