当前位置: 首页 > 科技观察

如何在PHP中实现套接字服务器

时间:2023-03-15 19:26:23 科技观察

想要构建聊天应用程序,甚至是游戏?那么,套接字服务器将是您的第一步。一旦了解了创建服务器的基本功能,后续的优化步骤也同样简单。套接字服务器的工作方式是持续运行以等待来自客户端的连接。一旦客户端连接上,服务器就会将其添加到客户端列表中,并开始等待来自客户端的消息。不要走开,这里是完整的源代码://Settimelimittoindefiniteexecutionset_time_limit(0);//Settheipandportwewilllistenon$address='localhost';$port=10000;$max_clients=10;//Arraythatwillholdclientinformation$client=Array();//创建一个TCPStreamsocket$sock=socket_create(AF_INET,SOCK_STREAM,0);//Bindthesockettoanaddress/portsocket_bind($sock,$address,$port)ordie('Couldnotbindtoaddress');//Startlisteningforconnectionssocket_listen($袜子);echo"Waitingforconnections...\r\n";//Loopcontinuouslywhile(true){//Setupclientslistensocketforreading$read[0]=$sock;for($i=0;$i<$max_clients;$i++){if(isset($client[$i]['sock']))$read[$i+1]=$client[$i]['sock'];}//设置阻塞calltosocket_select()if(socket_select($read,$write=NULL,$except=NULL,$tv_sec=5)<1)continue;/*ifanewconnectionisbeingaddittotheclientarray*/if(in_array($sock,$read)){for($i=0;$i<$max_clients;$i++){if(empty($client[$i]['sock'])){$client[$i]['sock']=socket_accept($sock);echo"Newclientconnected$i\r\n";break;}elseif($i==$max_clients-1)ech??o"Toomanyclients...\r\n";}}//endifin_array//Ifaclientistryingtowrite-handleitnowfor($i=0;$i<$max_clients;$i++){//foreachclientif(isset($client[$i]['sock'])){if(in_array($client[$i]['sock'],$read)){$input=socket_read($client[$i]['sock'],1024);if($input==null){echo"Clientdisconnecting$i\r\n";//Zerolengthstringmeaningdisconnectedunset($client[$i]);}else{echo"Newinputreceived$i\r\n";//sendittotheotherclientsfor($j=0;$j<$max_clients;$j++){if(isset($client[$j]['sock'])&&$j!=$i){echo"Writing'$input'toclient$j\r\n";socket_write($client[$j]['sock'],$input,strlen($input));}}if($input=='exit'){//requesteddisconnectsocket_close($client[$i]['sock']);}}}else{echo"Clientdisconnected$i\r\n";//Closethesocket_close($client[$i]['sock']);unset($client[$i]);}}}}//endwhile//Closethemastersocketsocket_close($sock);嗯,乍一看这似乎是一个大工程,但是我们可以先把它分解成几个更小的部分第一部分是创建服务器。Lines:2to20.这部分代码设置了变量、地址、端口、***clients和client数组。接下来创建套接字并将其绑定到我们指定的地址和端口。接下来我们要做的是执行一个无限循环(实际上我们是故意的!)。行:22到32。我们在这部分代码中做的第一步是设置$read数组。该数组包含所有客户端的套接字和我们的主服务器的套接字。该变量稍后将在select语句中使用:告诉PHP监听来自这些客户端的每条消息。socket_select()的最后一个参数告诉我们的服务器在返回值之前最多等待5秒。如果它的返回值小于1,说明没有收到数据,就回到循环顶部继续等待。脚本的下一部分是将新客户端添加到阵列中。第33至44行。将新客户放在列表的末尾。检查以确保没有超过我们希望服务器处理的客户端。下面显示的代码块非常大,是服务器的主要部分。当客户端向服务端发送消息时,需要这段代码出面处理。消息可以是各种类型,断开连接消息,实际断开连接——只要它们是服务器需要处理的消息即可。行:46到最后。代码循环遍历每个客户端并检查是否已收到来自它们的消息。如果是,获取输入的内容。根据输入检查是否是断开连接的消息,如果是则将其从数组中删除,否则为正常消息,然后我们的服务器再次遍历所有客户端并逐条写入消息,Skip发件人。好吧,让我们尝试创建您自己的聊天服务器!