PHP socket多用戶socket通信demo
server.php 服務端腳本
function server()
{
date_default_timezone_set('PRC'); //設置時區
set_time_limit(0); //腳本請求時間響應無限制
error_reporting(null); //屏蔽錯誤警告
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); //創建socket
socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,1); //配置參數
socket_set_nonblock($socket);//無阻塞
if ($bind = socket_bind($socket,'127.0.0.1',8889)==false) { //綁定ip,端口
echo "socket bind fail:".socket_strerror(socket_last_error($bind));
}
if ($listen = socket_listen($socket,4)==false) {//開始監聽
echo 'server listen fail:'.socket_strerror(socket_last_error($listen));
}
$socket_pool[] = $socket; //初始化連接池
$num = 0;//記錄連線用戶數
echo "歡迎來到PHP Socket測試服務。".PHP_EOL;
do {
$pools = $socket_pool;
$write = NULL;
$except = NULL;
socket_select($ths,$write,$except,NULL);//
foreach ($pools as $s) {
if ($s == $socket) {
$accept = socket_accept($s);
if ($accept) {
$socket_pool[] = $accept;//
}
$hand = false; //初次seq
$user = $num = $num+1; //新用戶數加1
echo "歡迎新用戶".$user.PHP_EOL;//$user用戶標識
$return_client = $user;
$res = socket_write($accept,$return_client,strlen($return_client));//發送用戶標識給客戶端
if (!$res) {
echo "fail to write";
}
} else {
$str = socket_read($s,1024);
if (!$hand) {
socket_write($s, '握手', strlen('握手'));
$hand = true;
} else {
echo "服務端接收:".$str.PHP_EOL;
foreach ($socket_pool as $send) {
if ($send != $socket && $send != $s) { //廣播數據,除自己和服務端外
if ($str) {
$return_client = '這是'.$str.PHP_EOL;
socket_write($send,$return_client,strlen($return_client));
} else {
echo 'close';
$num--;
socket_close($s);
}
}
}
}
}
}
} while(true);
socket_close($socket);
}
client.php 客戶端腳本
error_reporting(null);
date_default_timezone_set('PRC');
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array('sec' => 1,'usec' => 0));
socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array('sec' => 6,'usec' => 0));
if ($coon = socket_connect($socket,'127.0.0.1',8889) == false) {
echo 'connect error '.socket_strerror(socket_last_error($coon));
} else {
$num = 1;
do {
// if ($callback = socket_read($socket,1024)) {
// echo '羣內信息: '.$callback.PHP_EOL;
// }
// fwrite(STDOUT,'請輸入:');
// $msg = fgets(STDIN);
// $msg = substr($msg, 0, -1);
// if (base64_encode($msg) == base64_encode('end')) {
// echo $msg;
// socket_close($socket);
// break;
// }
$msg = array('甲','乙','丙','丁','end');
if ($callback = socket_read($socket,1024)) {
if ($num == 1) {
//服務端第一次回覆對的信息爲用戶標識
$user = intval($callback);//用戶標識
$num ++;
}
echo '羣內信息: '.$callback.PHP_EOL;
sleep(2);
}
$k = $user-1;
if ($msg[$k] == 'end') {
socket_close($socket);
}
sleep(2);
echo '發送內容:'.$msg[$k].PHP_EOL;
$sendMsg = '用戶'.$user.'發送'.$msg[$k];
if ($write = socket_write($socket,$sendMsg,strlen($sendMsg)) == false) {
$error = socket_strerror(socket_last_error($write));
echo 'fail to write '.$error;
socket_close($socket);
} else {
echo "client write success ".PHP_EOL;
}
} while(true);
}
socket_close($socket);