?php/*** File name server.php* 服务器端代码** @author bandit* @since 2014-09-09**///确保在连接客户端时不会超时set_time_limit(0);//设置IP和端口号$address = localhost;//$port =rand(3000,6000);$port = 8081; //调试的时候,可以多换端口来测试程
<?php /** * File name server.php * 服务器端代码 * * @author bandit * @since 2014-09-09 * */ //确保在连接客户端时不会超时 set_time_limit(0); //设置IP和端口号 $address = "localhost"; //$port =rand(3000,6000); $port = 8081; //调试的时候,可以多换端口来测试程序! /** * 创建一个SOCKET * AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6 * SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM */ $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); //阻塞模式 socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); //端口复用 if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) { echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL; } //绑定到socket端口 $result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); //开始监听 $result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); echo "OK\nBinding the socket on $address:$port ... "; echo "OK\nNow ready to accept connections.\nListening on the socket ... \n"; while(true){ $pid = pcntl_fork(); if($pid == -1){ die('fork error'); }elseif($pid){ //父进程会得到子进程号,所以这里是父进程执行的逻辑 //pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。 }else{ //$msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n"); while($msgsock = socket_accept($sock)){ //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息 do{ //读取客户端数据 echo "Read client data \n"; //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符. $buf = socket_read($msgsock, 8192); echo "Received msg: $buf?? \n"; $msg = "you said $buf \n"; socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) . "/n"); }while(true); socket_close($msgsock); } } } socket_close($sock);
原文地址:php socket 多客户端连接示例, 感谢原作者分享。