Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.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_Apache_Sockets_Ubuntu_Websocket - Fatal编程技术网

Php 套接字正在等待客户端写入,然后再写入

Php 套接字正在等待客户端写入,然后再写入,php,apache,sockets,ubuntu,websocket,Php,Apache,Sockets,Ubuntu,Websocket,Desire:我想连接到套接字并每秒向客户端发送“running” 这当然是一种考验 问题:仅当客户端发送数据时,才会发送输出“正在运行”。循环似乎正在暂停,等待客户端写回 代码: $socket = @socket_create_listen("12345"); while (true) { $client = socket_accept($socket); $msg = "\nHello"."\r\n".chr(0); $length = strlen($msg);

Desire:我想连接到套接字并每秒向客户端发送“running”

这当然是一种考验

问题:仅当客户端发送数据时,才会发送输出“正在运行”。循环似乎正在暂停,等待客户端写回

代码:

$socket = @socket_create_listen("12345");

while (true) {
    $client = socket_accept($socket);
    $msg = "\nHello"."\r\n".chr(0);
    $length = strlen($msg);
    socket_write($client, $msg,$length);
    usleep(5);

    while (true) {
        $msg = 'running'."\r\n".chr(0);
        $length = strlen($msg);
        socket_write($client, $msg, $length);
        sleep(1);
    }
}
示例:上面的代码在我的服务器上的一个文件中。如果我运行此文件,然后使用telnet在端口12345上连接到我的服务器
telnet myip#12345
,我希望控制台每秒都会显示“running”(正在运行)。相反,“running”只写一次。如果我在控制台中键入某个内容(即将数据写入服务器),将再次显示正在运行的。因此,只有当我向服务器发送某些内容时,才会将其发送到控制台

这是什么原因造成的

谢谢
JT

您是否尝试过使用其他客户端?nc(netcat)非常适合测试东西。另外,在服务器发送数据时,将一些输出放在服务器上,使其记录(到屏幕或文件中)

我猜您的服务器工作正常,但您的客户端在某种程度上出现了问题。只需键入
nc12345
,看看您得到了什么

记住,telnet是一个实际的协议(),而nc只是一个直接的TCP


另外,NUL终止字符串可能会导致奇怪的问题。丢失chr(0)位,看看这是否会使它变得更好。

服务器似乎很好。问题很可能出在你的客户身上。我调整了你的服务器,并编写了一个客户端,成功地测试了。我的调整是检查插座是否关闭。否则,您将进入一个连续循环

这里是socketserver.php

下面是socketclient.php

$address = '127.0.0.1';
$port = 55000;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit;
}

echo "\nStarting client";
echo "\nAttempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
echo "\n\nReading responses...\n\n";
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

echo "\nClosing socket...";
socket_close($socket);
下面是结果的屏幕截图


我意识到这是一个测试,但请注意,使用UDP设计定期状态服务器更有意义

看不到对等代码是不可能的,但是如果对等方正在向您发送数据,并且发送应该控制这些发送,那么您为什么不读取它?@EJP对等代码?下面的代码在我的服务器上的一个文件中。当我运行该文件时,我可以在命令提示符下使用telnet进行连接…telnet myip#12345…在这里,我希望运行时每秒都能得到回音。我不知道你为什么说这是不可能的?我在它不起作用的时候加了一点,但我会尝试一些东西并发回!感谢telnet RFC的agianLooking,NUL似乎是一个特殊的角色,尤其是在回车和换行之后。我不清楚到底发生了什么,但无论如何,我肯定会失去它。@tman我得跑一会儿。如果你还有问题,我会在几个小时后检查。另外,请看另一个答案,了解如何正确检查断开连接。这不会解决您现在遇到的问题,但它会解决您在解决此问题后将来可能遇到的问题。好的,我更新为使用putty,它允许原始TCP连接。同样,当我将数据传递给塞尔维亚人时,我只获取数据:-/为什么要测试套接字在睡眠后是否关闭?@Dan我希望使用原始连接,因此除了打开然后连接到服务器之外,没有任何客户端脚本。@xaxxon我没有关闭服务器。客户做到了。这张支票比寄出去的更好。检查需要转到某个地方,否则在客户端断开连接后,逻辑将进入无限失败循环。谢谢工作得很好!:)我知道我做错了什么,但你的很好。在你遇到脱节的情况之前,两者之间没有实质性的区别。如果你使用telnet,它还能工作吗?还是您只使用了提供的客户端代码?
$address = '127.0.0.1';
$port = 55000;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit;
}

echo "\nStarting client";
echo "\nAttempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
echo "\n\nReading responses...\n\n";
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

echo "\nClosing socket...";
socket_close($socket);