【发布时间】:2014-05-19 15:28:52
【问题描述】:
我已经为此工作了好几个小时,但我无法弄清楚。我也浏览了这里的帖子,试图找到解决方案,但无济于事。
我为基于浏览器的游戏设置了 Socket 服务器。我已将其剥离以试图找到问题,并且 fread 似乎挂起,因为如果我注释掉“fread($fp, 10024);”然后它运行良好,但当然不会读取响应。
在调试时,我已将文件分解为基本内容。
我有 Socket 服务器: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);
$errstr 不会显示错误,因为当我启动 ChatServer.php 然后重新加载 Test.php 时,它永远不会重新加载。它挂了几分钟并且落后于我的整个服务器。我在 VPS 上运行。之前很好用,后来突然停止工作,我不知道为什么。
编辑:感谢 GigaWatt,我能够让它工作。如果您有同样的问题,这是我使用的代码。 :)
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);
$meta = stream_get_meta_data($sock);
if($meta['unread_bytes'] > 0) {
$incomingData = socket_read($childSocket, $meta['unread_bytes']);
}
socket_write($childSocket, $chatContent, strlen($chatContent));
} while(true);
只需使用 stream_get_meta_data,然后使用 unread_bytes。
【问题讨论】:
-
用
while($incomingData)替换while(true)怎么样? -
仍然挂起该更改。