套接字客户端发送消息
问题描述:
我是套接字连接的新手, 我想向套接字服务器发送一些命令,但是我只能发送第一条消息而不是其他消息。套接字客户端发送消息
客户:
$fp = stream_socket_client("tcp://127.0.0.1:1000", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$cmd_1 = "hello";
fwrite($fp, $cmd_1);
while (!feof($fp)) {
print_r(fgets($fp, 1024));
}
$cmd_2 = "second message";
fwrite($fp, $cmd_2);
while (!feof($fp)) {
print_r(fgets($fp, 1024));
}
fclose($fp);
}
我怎么能发送类似第一$cmd_1
多条消息,并且依赖于结果,我要送$cmd_2
?
服务器
error_reporting(E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit(0);
/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();
$address = '127.0.0.1';
$port = 1000;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}
if (socket_bind($sock, $address, $port) === false) {
echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
if (socket_listen($sock, 5) === false) {
echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
do {
if (($msgsock = socket_accept($sock)) === false) {
echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
break;
}
/* Send instructions. */
$msg = "\nWelcome to the PHP Test Server. \n" .
"To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}
$talkback = "PHP: You said '$buf'.\n";
socket_write($msgsock, $talkback, strlen($talkback));
echo "$buf\n";
} while (true);
socket_close($msgsock);
} while (true);
socket_close($sock);
答
的问题是在下面的一行:
while (!feof($fp)) {
什么,做的是:它等待插槽上的EOF(套接字关闭通常情况下)。它会得到你第一个响应,并等待进一步的响应而不发送任何进一步的请求(while循环)。你想读取你发送的每个请求消息的响应消息,对吧?
修改代码,像这样的(未经测试,但应工作):
$cmd_1 = "hello";
fwrite($fp, $cmd_1);
print_r(fgets($fp, 1024));
$cmd_2 = "second message";
fwrite($fp, $cmd_2);
print_r(fgets($fp, 1024));
fclose($fp);
fgets(..)
将返回从插座一旦行被读取。你实际上不需要一个while循环。
此外,它是一个很好的一点,开始定义您的通信结构/协议。在客户端,您正在逐行阅读,但不是服务器。插座(在服务器上)读取可以返回部分消息。如果您决定使用通信结构,则可以将读取设计为不返回,直到读取整个结构为止。
+0
谢谢你的回复,但仍然得到相同的结果。 – user2136174 2013-04-30 09:49:26
答
问题是与
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
而是比较假的做=== ''
if ('' === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
否则连接被提前关闭 - 在这里看到的 - http://www.php.net/manual/en/function.socket-read.php#89133
你是什么错误?事实上你的问题是什么? – leftclickben 2013-04-30 08:26:26
我可以发送第一条消息,我只收到第一条消息的回复,而不是第二条消息。 – user2136174 2013-04-30 08:27:32
你确定你的服务器的行为?是否对从客户端获得的每个输入做出响应?你应该检查fgets和fwrite函数的返回值。 – Marcassin 2013-04-30 09:00:49