摘要:服務端設置阻塞模式在現有資源列表中找不到給定資源對應的索引在現有資源列表中找不到給定用戶對應的客戶端資源監聽客戶端連接監聽客戶端消息來自客戶端的消息客戶端接受客戶端發來的消息下午時間到來自的消息客戶端發送消息給客戶端下午時間到來
服務端
$url = "tcp://0.0.0.0:9160"; $stream = stream_socket_server($url , $errno , $errstr); // 設置阻塞模式 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 "在現有資源列表中找不到給定資源對應的索引" . PHP_EOL; return false; }; $find_client = function($username) use(&$client_list) { foreach ($client_list as $v) { if ($v["username"] === $username) { return $v["resource"]; } } echo "在現有資源列表中找不到給定用戶對應的客戶端資源" . 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) { // 監聽客戶端連接 $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]; // 監聽客戶端消息 $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 "來自客戶端的消息:from:{$msg["from"]};to:{$msg["to"]};msg:{$msg["msg"]} "; } } } } } usleep(100 * 1000); }客戶端 A(接受客戶端 B 發來的消息)
$username , "to" => "yueshu" , "msg" => "hello girl" ]; $is_flag = false; while (true) { $e_time = time(); if ($e_time - $s_time > $duration) { echo "20s 時間到" . 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 "來自{$msg["from"]}的消息:{$msg["msg"]} "; } usleep(10 * 1000); }客戶端 B(發送消息給客戶端 A)
$username , "to" => "chenxuelong" , "msg" => "hello boy" ]; $is_flag = false; while (true) { $e_time = time(); if ($e_time - $s_time > $duration) { echo "20s 時間到" . 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 "來自{$msg["from"]}的消息:{$msg["msg"]} "; } */ sleep(1); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30684.html
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
摘要:,之前在寫過一篇微信支付教程手把手教你實現小程序的微信支付。說說必須要自己填寫的東西開頭的這幾個信息都可以從小程序后臺微信支付申請成功后發的郵件中拿到。 你好,是我琉憶,一個文藝的程序員。 很久沒有更新什么技術文了,特在此補上一篇精華文章——微信支付。PS,之前在segmentfault寫過一篇微信支付教程:手把手教你實現小程序的微信支付。【從發表開始,到現在被很多人收藏,加微信和QQ...
閱讀 2225·2021-11-22 15:29
閱讀 4106·2021-11-04 16:13
閱讀 995·2019-08-29 16:58
閱讀 343·2019-08-29 16:08
閱讀 1463·2019-08-23 17:56
閱讀 2386·2019-08-23 17:06
閱讀 3169·2019-08-23 16:55
閱讀 2063·2019-08-23 16:22