欲望:我想连接到套接字,并且每秒都会向客户端发送“正在运行”。
这当然是一种考验。
问题:输出'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
我希望每秒都能在控制台中看到“正在运行”。相反,“运行”只写一次。如果我在控制台中键入内容(即将数据写入服务器),则会再次显示运行。因此,当我向服务器发送内容时,仅运行发送到控制台。
是什么导致这种情况?
由于 JT
答案 0 :(得分:2)
服务器似乎很好。问题最有可能发生在您的客户身上。我调整了你的服务器并编写了一个成功测试的客户端。我的调整是检查插座是否关闭。否则,您将进入连续循环。
这是socketserver.php
echo "Starting Server" . "\n\r";
$socket = @socket_create_listen("55000");
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);
$test = socket_write($client, $msg, $length);
sleep(1);
if ($test === false) {
echo "socket probably closed\n";
exit;
}
}
}
这是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设计更有意义。
答案 1 :(得分:1)
您是否尝试过使用其他任何客户? nc(netcat)非常适合测试。此外,在服务器中放置一些输出,以便在发送数据时记录(到屏幕或文件)。
我猜你的服务器工作正常但你的客户端却以某种方式搞砸了。只需输入nc <my_ip> 12345
,看看你得到了什么。
请记住,telnet是一个实际的协议(http://tools.ietf.org/html/rfc854),而nc只是直接的TCP。
此外,NUL终止字符串可能会导致奇怪的问题。丢失chr(0)位,看看是否更好。