I am newbie for socket connections, I want to send some commands, to socket server, but I can only just send first message not the others.
Client:
$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);
}
How can I send multiple messages like first $cmd_1
, and depends on the result, i have to send $cmd_2
?
server
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);
The problem is in the below line:
while (!feof($fp)) {
What that does is: it waits for the EOF on that socket (socket close usually). It gets you the first response, and waits for further response without sending any further requests(while loop).. You'd want to read the response message for every request message that you send, right?
Modify your code like this (untested, but should work):
$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(..)
will return once a line is read from the socket. You dont actually need a while loop there.
Also, its a nice point to start defining the structure/protocol for your communications. On the client side you are reading line-by-line, but not the server. The socket (on the server) read can return with partial message. If you decide on a structure of communication, you can design the reads to not return till an entire structure is read.
The problem is with
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
instead of comparing it to false do === ''
if ('' === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
as otherwise connection is being closed prematurely - see here - http://www.php.net/manual/en/function.socket-read.php#89133
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With