php soecket服务器搭建_用PHP的Socket建立自己的聊天室服务器_PHP教程

* @package patServer

*/

class patServer{

/**

* information about the project

* @var array $systemVars

*/

var $systemVars = array(

"appName" => "patServer",

"appVersion" => "1.1",

"author" => array("Stephan Schmidt ", )

);

/**

* port to listen

* @var integer $port

*/

var $port = 10000;

/**

* domain to bind to

* @var string $domain

*/

var $domain = "localhost";

/**

* maximum amount of clients

* @var integer $maxClients

*/

var $maxClients = -1;

/**

* buffer size for socket_read

* @var integer $readBufferSize

*/

var $readBufferSize = 128;

/**

* end character for socket_read

* @var integer $readEndCharacter

*/

var $readEndCharacter = "

";

/**

* maximum of backlog in queue

* @var integer $maxQueue

*/

var $maxQueue = 500;

/**

* debug mode

* @var boolean $debug

*/

var $debug = true;

/**

* debug mode

* @var string $debugMode

*/

var $debugMode = "text";

/**

* debug destination (filename or stdout)

* @var string $debugDest

*/

var $debugDest = "stdout";

/**

* empty array, used for socket_select

* @var array $null

*/

var $null = array();

/**

* all file descriptors are stored here

* @var array $clientFD

*/

var $clientFD = array();

/**

* needed to store client information

* @var array $clientInfo

*/

var $clientInfo = array();

/**

* needed to store server information

* @var array $serverInfo

*/

var $serverInfo = array();

/**

* amount of clients

* @var integer $clients

*/

var $clients = 0;

/**

* create a new socket server

*

* @access public

* @param string $domain domain to bind to

* @param integer $port port to listen to

*/

function patServer( $domain = "localhost", $port = 10000 ){

$this->domain = $domain;

$this->port = $port;

$this->serverInfo["domain"] = $domain;

$this->serverInfo["port"] = $port;

$this->serverInfo["servername"] = $this->systemVars["appName"];

$this->serverInfo["serverversion"] = $this->systemVars["appVersion"];

set_time_limit( 0 );

}

/**

* set maximum amount of simultaneous connections

*

* @access public

* @param int $maxClients

*/

function setMaxClients( $maxClients ){

$this->maxClients = $maxClients;

}

/**

* set debug mode

*

* @access public

* @param mixed $debug [text|htmlfalse]

* @param string $dest destination of debug message (stdout to output or filename if log should be written)

*/

function setDebugMode( $debug, $dest = "stdout" ){

if( $debug === false ){

$this->debug = false;

return true;

}

$this->debug = true;

$this->debugMode = $debug;

$this->debugDest = $dest;

}

/**

* start the server

*

* @access public

* @param int $maxClients

*/

function start(){

$this->initFD = @socket_create( AF_INET, SOCK_STREAM, 0 );

if( !$this->initFD )

die( "patServer: Could not create socket." );

// adress may be reused

socket_setopt( $this->initFD, SOL_SOCKET, SO_REUSEADDR, 1 );

// bind the socket

if(!@socket_bind( $this->initFD, $this->domain, $this->port ) ){

@socket_close( $this->initFD );

die( "patServer: Could not bind socket to ".$this->domain." on port ".$this->port." ( ".$this->getLastSocketError( $this->initFd )." )." );

}

// listen on selected port

if(!@socket_listen( $this->initFD, $this->maxQueue ) )

die( "patServer: Could not listen ( ".$this->getLastSocketError( $this->initFd )." )." );

$this->sendDebugMessage( "Listening on port ".$this->port.". Server started at ".date( "H:i:s", time() ) );

// this allows the shutdown function to check whether the server is already shut down

$GLOBALS["_patServerStatus"] = "running";

// this ensures that the server will be sutdown correctly

register_shutdown_function( array( $this, "shutdown" ) );

if( method_exists( $this, "onStart" ) )

$this->onStart();

$this->serverInfo["started"] = time();

$this->serverInfo["status"] = "running";

while( true ){

$readFDs = array();

array_push( $readFDs, $this->initFD );

// fetch all clients that are awaiting connections

for( $i = 0; $i < count( $this->clientFD ); $i++ )

if( isset( $this->clientFD[$i] ) )

array_push( $readFDs, $this->clientFD[$i] );

// block and wait for data or new connection

$ready = @socket_select( $readFDs, $this->null, $this->null, NULL );

if( $ready === false ){

$this->sendDebugMessage( "socket_select failed." );

$this->shutdown();

}

// check for new connection

if( in_array( $this->initFD, $readFDs ) ){

$newClient = $this->acceptConnection( $this->initFD );

// check for maximum amount of connections

if( $this->maxClients > 0 ){

if( $this->clients > $this->maxClients ){

$this->sendDebugMessage( "Too many connections." );

if( method_exists( $this, "onConnectionRefused" ) )

$this->onConnectionRefused( $newClient );

$this->closeConnection( $newClient );

}

}

if( --$ready <= 0 )

continue;

}

// check all clients for incoming data

for( $i = 0; $i < count( $this->clientFD ); $i++ ){<

http://www.bkjia.com/PHPjc/508269.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/508269.htmlTechArticle?PHP /** * patServer * PHP socket server base class * Events that can be handled: * * onStart * * onConnect * * onConnectionRefused * * onClose * * onShutdown * * onReceiveData * *...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值