Server 端:
<?php
error_reporting (E_ALL);
set_time_limit (0);
ob_implicit_flush ();
$ip = "127.0.0.1";
$port = 12345;
$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
echo $socket ? "socket_create() successed!\n" : "socket_create() failed:".socket_strerror ($socket)."\n";
$setLinger['l_onoff'] = 1;
$setLinger['l_linger'] = 0;
$set = socket_set_option($socket,SOL_SOCKET,SO_LINGER,$setLinger);
echo $set ? "socket_set_option() successed!\n" : "socket_set_option() failed:".socket_strerror(socket_last_error())."\n";
$bind = socket_bind ($socket, $ip, $port);
echo $bind ? "socket_bind() successed!\n" : "socket_bind() failed:".socket_strerror ($bind)."\n";
$listen = socket_listen ($socket,10000);
echo $listen ? "socket_listen() successed!\n" : "socket_listen() failed:".socket_strerror ($listen)."\n";
$queue = new Queue();
while (true){
$msg = socket_accept($socket);
if (!$msg){
echo "socket_accept() failed:".socket_strerror ($msg)."\n";
break;
}
while (true){
$command = trim(socket_read($msg,1024));
if (!$command){
break;
}
else if($command == "readnow"){
$out = $queue->deQueue();
if($out != ""){
socket_write($msg,$out,strlen($out));
}
else{
socket_write($msg,"NULL",strlen("NULL"));
}
echo 'send out!'."\n";
}
else{
if($queue->enQueue($command)){
socket_write($msg,"success",strlen("success"));
}
echo 'write in!'."\n";
}
}
socket_close ($msg);
}
socket_close ($socket);
socket_close ($dbsocket);
class Queue{
private $queue;
private $front;
private $rear;
function Queue(){
$this->queue[0]["content"] = "NULL";
$this->front = 0;
$this->rear = 0;
return true;
}
function enQueue($node){
$this->rear += 1;
$this->queue[$this->rear]["content"] = $node;
return true;
}
function deQueue(){
if($this->front == $this->rear){
return false;
}else{
$this->front += 1;
$temp = $this->queue[$this->front]["content"];
unset($this->queue[$this->front]);
if($this->front == $this->rear){
$this->front = 0;
$this->rear = 0;
}
return $temp;
}
}
}
?>
队列写入端:
<?
$ip = "127.0.0.1";
$port = 12345;
$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
$conn = socket_connect ($socket, $ip, $port);
socket_write($socket,"HELLO WORLD",strlen("HELLO WORLD"));
echo socket_read ($socket,1024);
socket_close ($socket);
?>
队列读取端:
<? $ip = "127.0.0.1"; $port = 12345; $socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); $conn = socket_connect ($socket, $ip, $port); socket_write($socket,"readnow",strlen("readnow")); echo socket_read ($socket,1024); socket_close ($socket); ?>要停止服务端,只用修改队列写入端,发送一个空消息就行了
_call和___callStatic这两个函数是php类的默认函数,
__call() 在一个对象的上下文中,如果调用的方法不能访问,它将被触发
__callStatic() 在一个静态的上下文中,如果调用的方法不能访问,它将被触发
<?php
class MethodTest {
public function __call($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context'); // As of PHP 5.3.0
?>
运行结果:
Calling object method ‘runTest’ in object context
Calling static method 'runTest' in static context
PHP使用Berkley的socket库来创建它的连接。socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
服务器端代码:
Read More »
关于本人
本人虎子,今年24,正好本命年