1:一个最简单的tcp服务
$socket = stream_socket_server("tcp://0.0.0.0:1215", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'The local time is ' . date('Y-m-d H:i:s) . "\r\n");
fclose($conn);
}
fclose($socket);
}
2:一个最简单的udp服务
$socket = stream_socket_server("udp://127.0.0.1:1215", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("$errstr ($errno)");
}
do {
$pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
echo "$peer\r\n";
stream_socket_sendto($socket,'The local time is ' . "\r\n", 0, $peer);
} while ($pkt !== false);
3:一个简单的http服务
$server = stream_socket_server('tcp://0.0.0.0:1215', $errno, $errstr);
while(true)
{
$buffer = '';
print "waiting...";
$client = stream_socket_accept($server);
print "accepted " . stream_socket_get_name( $client, true) . "\n";
if( $client )
{
$buffer .= fread($client, 1024);
// Respond to client
fwrite($client, "HTTP/1.1 200 OK\r\n"
. "Connection: close\r\n"
. "Content-Type: text/html\r\n"
. "\r\n"
. "Hello World! " . microtime(true)
. "<pre>{$buffer}</pre>");
fclose($client);
} else {
print "error.\n";
}
}
4:一个简单的https服务
<?php
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'local_cert', 'test.pem');
stream_context_set_option($context, 'ssl', 'local_pk', 'test.key');
stream_context_set_option($context, 'ssl', 'allow_self_signed',true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);
$server = stream_socket_server('ssl://0.0.0.0:1215', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
while(true)
{
$buffer = '';
print "waiting...";
$client = stream_socket_accept($server);
print "accepted " . stream_socket_get_name( $client, true) . "\n";
if( $client )
{
$buffer .= fread($client, 2046);
// Respond to client
fwrite($client, "HTTP/1.1 200 OK\r\n"
. "Connection: close\r\n"
. "Content-Type: text/html\r\n"
. "\r\n"
. "Hello World! " . microtime(true)
. "<pre>{$buffer}</pre>");
fclose($client);
} else {
print "error.\n";
}
}
5:用select事件来做服务
$master = array();
$socket = stream_socket_server("tcp://0.0.0.0:1215", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
$master[] = $socket;
$read = $master;
while (1) {
$read = $master;
$mod_fd = @stream_select($read, $_w = NULL, $_e = NULL, 10);
echo date("Y-m-d H:i:s")."stream_select\r\n";
if ($mod_fd === FALSE) {
break;
}
for ($i = 0; $i <= $mod_fd; $i++) {
if ( is_resource($read[$i]) ){
echo $i." is resource \r\n";
if ($read[$i] === $socket) {
$conn = stream_socket_accept($socket);
fwrite($conn, "Welcome Hello! The time is ".date("Y-m-d H:i:s")."\n");
$master[] = $conn;
} else {
$sock_data = fread($read[$i], 2048);
if (strlen(trim($sock_data),"\n") === 0) { // connection closed
echo "connection closed\n";
$key_to_del = array_search($read[$i], $master, TRUE);
fclose($read[$i]);
unset($master[$key_to_del]);
exit;
} else if ($sock_data === FALSE) {
echo "Something bad happened";
$key_to_del = array_search($read[$i], $master, TRUE);
unset($master[$key_to_del]);
exit;
} else {
$str = "The client has sent :".trim($sock_data,"\n")."\n";
fwrite($read[$i], $str);
fclose($read[$i]);
unset($master[array_search($read[$i], $master)]);
}
}
}else{
echo $i." is not resource \n";
}
}
}
}
简单用stream扩展写了几个例子,其实它的功能可以扩展到很强大的功能。
