/** "appName" => "patServer", /** /** /** /** /** /** /** /** /** /** /** /** /** /** /** $this->serverInfo["domain"] = $domain; set_time_limit( 0 ); /** /** $this->debug = true; /** // adress may be reused // bind the socket // listen on selected port $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 if( method_exists( $this, "onStart" ) ) $this->serverInfo["started"] = time(); while( true ){ // fetch all clients that are awaiting connections // block and wait for data or new connection if( $ready === false ){ // check for new connection // check for maximum amount of connections if( method_exists( $this, "onConnectionRefused" ) ) $this->closeConnection( $newClient ); if( --$ready continue; // check all clients for incoming data
* patServer
* PHP socket server base class
* Events that can be handled:
* * onStart
* * onConnect
* * onConnectionRefused
* * onClose
* * onShutdown
* * onReceiveData
*
* @version 1.1
* @author Stephan Schmidt
* @package patServer
*/
class patServer{
/**
* information about the project
* @var array $systemVars
*/
var $systemVars = array(
"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["port"] = $port;
$this->serverInfo["servername"] = $this->systemVars["appName"];
$this->serverInfo["serverversion"] = $this->systemVars["appVersion"];
}
* 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->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." );
socket_setopt( $this->initFD, SOL_SOCKET, SO_REUSEADDR, 1 );
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 )." )." );
}
if(!@socket_listen( $this->initFD, $this->maxQueue ) )
die( "patServer: Could not listen ( ".$this->getLastSocketError( $this->initFd )." )." );
$GLOBALS["_patServerStatus"] = "running";
// this ensures that the server will be sutdown correctly
register_shutdown_function( array( $this, "shutdown" ) );
$this->onStart();
$this->serverInfo["status"] = "running";
$readFDs = array();
array_push( $readFDs, $this->initFD );
for( $i = 0; $i clientFD ); $i++ )
if( isset( $this->clientFD[$i] ) )
array_push( $readFDs, $this->clientFD[$i] );
$ready = @socket_select( $readFDs, $this->null, $this->null, NULL );
$this->sendDebugMessage( "socket_select failed." );
$this->shutdown();
}
if( in_array( $this->initFD, $readFDs ) ){
$newClient = $this->acceptConnection( $this->initFD );
if( $this->maxClients > 0 ){
if( $this->clients > $this->maxClients ){
$this->sendDebugMessage( "Too many connections." );
$this->onConnectionRefused( $newClient );
}
}
}
for( $i = 0; $i clientFD ); $i++ ){

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境