摘要:服務(wù)端設(shè)置阻塞模式在現(xiàn)有資源列表中找不到給定資源對(duì)應(yīng)的索引在現(xiàn)有資源列表中找不到給定用戶對(duì)應(yīng)的客戶端資源監(jiān)聽客戶端連接監(jiān)聽客戶端消息來(lái)自客戶端的消息客戶端接受客戶端發(fā)來(lái)的消息下午時(shí)間到來(lái)自的消息客戶端發(fā)送消息給客戶端下午時(shí)間到來(lái)
服務(wù)端
$url = "tcp://0.0.0.0:9160"; $stream = stream_socket_server($url , $errno , $errstr); // 設(shè)置阻塞模式 stream_set_blocking($stream , false); $client_list = []; $resource_list = []; $resource_list[] = $stream; $find= function($client) use(&$client_list){ foreach ($client_list as $k => $v) { if ($v["resource"] === $client) { return $k; } } echo "在現(xiàn)有資源列表中找不到給定資源對(duì)應(yīng)的索引" . PHP_EOL; return false; }; $find_client = function($username) use(&$client_list) { foreach ($client_list as $v) { if ($v["username"] === $username) { return $v["resource"]; } } echo "在現(xiàn)有資源列表中找不到給定用戶對(duì)應(yīng)的客戶端資源" . PHP_EOL; return false; }; while (true) { $read = $resource_list; $write = $resource_list; $except = []; $wait_s = 0; $wait_us = 0; stream_select($read , $write , $except , $wait_s , $wati_us); foreach ($read as $v) { if ($v === $stream) { // 監(jiān)聽客戶端連接 $client = stream_socket_accept($v); if (is_resource($client)) { $resource_list[] = $client; $client_list[] = [ "username" => null , "resource" => $client ]; } } else { $index = $find($v); $user = $client_list[$index]; // 監(jiān)聽客戶端消息 $msg = fread($v , 65535); if (!empty($msg)) { if (!is_null($user) && is_null($user["username"]) && preg_match("/username:(w+)/" , $msg , $matches) === 1) { $client_list[$index]["username"] = $matches[1]; } else { $msg = unserialize($msg); $client = $find_client($msg["to"]); if ($client !== false) { fwrite($client , serialize($msg)); } else { echo "來(lái)自客戶端的消息:from:{$msg["from"]};to:{$msg["to"]};msg:{$msg["msg"]} "; } } } } } usleep(100 * 1000); }客戶端 A(接受客戶端 B 發(fā)來(lái)的消息)
$username , "to" => "yueshu" , "msg" => "hello girl" ]; $is_flag = false; while (true) { $e_time = time(); if ($e_time - $s_time > $duration) { echo "20s 時(shí)間到" . PHP_EOL; break; } if (!$is_flag) { fwrite($client , "username:" . $username); $is_flag = true; } else { // $sends = serialize($send); // fwrite($client , $sends); } $msg = fread($client , 65535); if (!empty($msg)) { $msg = unserialize($msg); echo "來(lái)自{$msg["from"]}的消息:{$msg["msg"]} "; } usleep(10 * 1000); }客戶端 B(發(fā)送消息給客戶端 A)
$username , "to" => "chenxuelong" , "msg" => "hello boy" ]; $is_flag = false; while (true) { $e_time = time(); if ($e_time - $s_time > $duration) { echo "20s 時(shí)間到" . PHP_EOL; break; } if (!$is_flag) { fwrite($client , "username:" . $username); $is_flag = true; } else { $send = serialize($msg); fwrite($client , $send); } /* $msg = fread($client , 65535); if (!empty($msg)) { $msg = unserialize($msg); echo "來(lái)自{$msg["from"]}的消息:{$msg["msg"]} "; } */ sleep(1); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30684.html
摘要:即時(shí)通訊中,最重要的是響應(yīng)速度,我們需要展示消息列表那么這時(shí)會(huì)有未讀消息,未讀數(shù)量,最后一條消息內(nèi)容,時(shí)間等等。目前設(shè)計(jì)是單表單庫(kù)。這里只是對(duì)即時(shí)通訊設(shè)計(jì)上做了一些簡(jiǎn)要的闡述,如有疑問(wèn)和建議,請(qǐng)?jiān)谠u(píng)論區(qū)回復(fù)。 詳解即時(shí)通訊設(shè)計(jì)實(shí)現(xiàn)(PHP+GatewayWorker+Redis) 需要實(shí)現(xiàn)的功能 一對(duì)一聊天(私聊) 一對(duì)多聊天(群聊) 類似QQ,微信等聊天列表 實(shí)時(shí)消息 顯示 工具...
摘要:即時(shí)通訊中,最重要的是響應(yīng)速度,我們需要展示消息列表那么這時(shí)會(huì)有未讀消息,未讀數(shù)量,最后一條消息內(nèi)容,時(shí)間等等。目前設(shè)計(jì)是單表單庫(kù)。這里只是對(duì)即時(shí)通訊設(shè)計(jì)上做了一些簡(jiǎn)要的闡述,如有疑問(wèn)和建議,請(qǐng)?jiān)谠u(píng)論區(qū)回復(fù)。 詳解即時(shí)通訊設(shè)計(jì)實(shí)現(xiàn)(PHP+GatewayWorker+Redis) 需要實(shí)現(xiàn)的功能 一對(duì)一聊天(私聊) 一對(duì)多聊天(群聊) 類似QQ,微信等聊天列表 實(shí)時(shí)消息 顯示 工具...
摘要:即時(shí)通訊中,最重要的是響應(yīng)速度,我們需要展示消息列表那么這時(shí)會(huì)有未讀消息,未讀數(shù)量,最后一條消息內(nèi)容,時(shí)間等等。目前設(shè)計(jì)是單表單庫(kù)。這里只是對(duì)即時(shí)通訊設(shè)計(jì)上做了一些簡(jiǎn)要的闡述,如有疑問(wèn)和建議,請(qǐng)?jiān)谠u(píng)論區(qū)回復(fù)。 詳解即時(shí)通訊設(shè)計(jì)實(shí)現(xiàn)(PHP+GatewayWorker+Redis) 需要實(shí)現(xiàn)的功能 一對(duì)一聊天(私聊) 一對(duì)多聊天(群聊) 類似QQ,微信等聊天列表 實(shí)時(shí)消息 顯示 工具...
摘要:,之前在寫過(guò)一篇微信支付教程手把手教你實(shí)現(xiàn)小程序的微信支付。說(shuō)說(shuō)必須要自己填寫的東西開頭的這幾個(gè)信息都可以從小程序后臺(tái)微信支付申請(qǐng)成功后發(fā)的郵件中拿到。 你好,是我琉憶,一個(gè)文藝的程序員。 很久沒(méi)有更新什么技術(shù)文了,特在此補(bǔ)上一篇精華文章——微信支付。PS,之前在segmentfault寫過(guò)一篇微信支付教程:手把手教你實(shí)現(xiàn)小程序的微信支付。【從發(fā)表開始,到現(xiàn)在被很多人收藏,加微信和QQ...
閱讀 2234·2021-11-22 15:29
閱讀 4115·2021-11-04 16:13
閱讀 1000·2019-08-29 16:58
閱讀 346·2019-08-29 16:08
閱讀 1467·2019-08-23 17:56
閱讀 2393·2019-08-23 17:06
閱讀 3172·2019-08-23 16:55
閱讀 2068·2019-08-23 16:22