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扩展写了几个例子,其实它的功能可以扩展到很强大的功能。