Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP套接字服务器挂起_Php_Sockets - Fatal编程技术网

PHP套接字服务器挂起

PHP套接字服务器挂起,php,sockets,Php,Sockets,我在这件事上工作了好几个小时,我想不出来。我已经浏览了这里的帖子,试图找到解决方案,但也无济于事 我有一个基于浏览器的游戏的套接字服务器设置。为了找到问题,我把它剥离了,看起来fread被挂了,因为如果我把“fread($fp,10024);”注释掉,那么它运行得很好,但当然看不到响应 $fp = fsockopen("127.0.0.1", "9990", $errno, $errstr, 5); echo $errstr . "<br />"; echo fread($fp, 1

我在这件事上工作了好几个小时,我想不出来。我已经浏览了这里的帖子,试图找到解决方案,但也无济于事

我有一个基于浏览器的游戏的套接字服务器设置。为了找到问题,我把它剥离了,看起来fread被挂了,因为如果我把“fread($fp,10024);”注释掉,那么它运行得很好,但当然看不到响应

$fp = fsockopen("127.0.0.1", "9990", $errno, $errstr, 5);
echo $errstr . "<br />";
echo fread($fp, 10024);
当我调试这个程序时,我已经将文件分解到了最基本的部分

我有一个套接字服务器:ChatServer.php

set_time_limit(0);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_get_option($sock, SOL_SOCKET, SO_REUSEADDR);
socket_bind($sock, "127.0.0.1", "9990");
socket_listen($sock, 4);

$chatContent = "Testing, 1, 2, 3.";
do
{
    $childSocket = socket_accept($sock);
    $incomingData = socket_read($childSocket, 12048);

    socket_write($childSocket, $chatContent, strlen($chatContent));
} while(true);
然后我有Test.php,它应该打开套接字并读取响应

$fp = fsockopen("127.0.0.1", "9990", $errno, $errstr, 5);
echo $errstr . "<br />";
echo fread($fp, 10024);

只需使用流获取元数据,然后使用未读字节。

它完全按照您的要求执行:等待12048/10024字节的数据或套接字关闭


您可能对使用非阻塞套接字(
socket\u set\u nonblock/stream\u set\u blocking
)和
socket\u select
循环或libevent感兴趣。

socket\u read
的调用是一个阻塞调用,意味着在读取指定字节数之前,所有操作都会停止

如果需要继续处理,请考虑使用<代码> StudioGET-Meta Advase<代码>(<代码> unRead字节> /COD>值)检查是否有许多未读数据正在等待。 一旦达到所需的阈值,然后调用

socket\u read


while($incomingData)
替换
while(true)
怎么样?仍然挂起这个更改。在PHP中没有简单的方法可以做到这一点。考虑使用NoDE.js代替,它是可怕的,但有可爱的非阻塞APISI听到很多关于NoDE.js。我在一家web开发公司工作(这是一个个人项目,我是质量保证,不是开发人员),他们将使用node.js和其他一些东西来实现自动化。然而,我真的不知道node.js是什么。是否有一个非常简单的解释?它是服务器端的JavaScript,带有一堆文件系统和套接字API。如果你知道JS,只要阅读教程就可以了。你可能想看看哪一个看起来适合你的任务。这非常有效!非常感谢你!我在这个问题上花了将近10个小时,因为我讨厌寻求帮助,几分钟后你就找到了解决办法。