成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

五分鐘教你寫(xiě)超簡(jiǎn)單的swoole聊天室

移動(dòng)開(kāi)發(fā)
那么 我將所有的客戶端的鏈接存起來(lái)存成數(shù)組,每當(dāng)一個(gè)客戶端發(fā)送消息時(shí),我就遍歷這個(gè)客戶端數(shù)組,將消息群發(fā)一遍,不久實(shí)現(xiàn)了聊天室了嗎?

原本我是準(zhǔn)備接著寫(xiě)我那個(gè)多進(jìn)程教程的,今天心血來(lái)潮想看看swoole的websocket,

swoole-1.7.9 增加了內(nèi)置的websocket服務(wù)器支持,通過(guò)幾行PHP代碼就可以寫(xiě)出一個(gè)異步非阻塞多進(jìn)程的WebSocket服務(wù)器。

swoole_websocket_server 繼承自 swoole_http_server,如果設(shè)置了onRequest回調(diào),websocket服務(wù)器也可以同時(shí)作為http服務(wù)器。

  1. $server = new swoole_websocket_server("0.0.0.0"9501); 
  2.  
  3. $server->on('open', function (swoole_websocket_server $server, $request) { 
  4. echo "server: handshake success with fd{$request->fd}\n"
  5. }); 
  6.  
  7. $server->on('message', function (swoole_websocket_server $server, $frame) { 
  8. echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"
  9. $server->push($frame->fd, "this is server"); 
  10. }); 
  11.  
  12. $server->on('close', function ($ser, $fd) { 
  13. echo "client {$fd} closed\n"
  14. }); 
  15.  
  16. $server->start(); 

我看了看官網(wǎng)的demo,覺(jué)得看起來(lái)很簡(jiǎn)單嘛,

  1. <?php 
  2. //官網(wǎng)demo 
  3. $server = new swoole_websocket_server("0.0.0.0", 9501); 
  4.  
  5. $server->on('open', function (swoole_websocket_server $server, $request) { 
  6. echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客戶端id 
  7. }); 
  8.  
  9. $server->on('message', function (swoole_websocket_server $server, $frame) { 
  10. echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; 
  11. $server->push($frame->fd, "this is server");//$frame->fd 是客戶端id,$frame->data是客戶端發(fā)送的數(shù)據(jù) 
  12. //服務(wù)端向客戶端發(fā)送數(shù)據(jù)是用 $server->push( '客戶端id' , '內(nèi)容') 
  13. }); 
  14.  
  15. $server->on('close', function ($ser, $fd) { 
  16. echo "client {$fd} closed\n"; 
  17. }); 
  18.  
  19. $server->start(); 

我就是喜歡這種簡(jiǎn)單易懂的demo ,每行代碼意思一看就明白

服務(wù)端有了,我找點(diǎn)客戶端的js代碼

火狐的MDN

  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4. <title></title> 
  5. <meta charset="UTF-8"
  6. <script type="text/javascript"
  7. var exampleSocket = new WebSocket("ws://0.0.0.0:9501"); 
  8. exampleSocket.onopen = function (event) { 
  9. exampleSocket.send("親愛(ài)的服務(wù)器!我連上你啦!"); 
  10. }; 
  11. exampleSocket.onmessage = function (event) { 
  12. console.log(event.data); 
  13. </script> 
  14. </head> 
  15. <body> 
  16. <input type="text" id="content"
  17. <button onclick="exampleSocket.send( document.getElementById('content').value )">發(fā)送</button> 
  18. </body> 
  19. </html> 

***命令行運(yùn)行php文件,之后瀏覽器打開(kāi)html文件,

F12打開(kāi)調(diào)試界面看console,ok , 沒(méi)有問(wèn)題

這個(gè)時(shí)候我突然想到一個(gè)事情,因?yàn)槲易龆噙M(jìn)程的那個(gè)教程里,在主進(jìn)程中會(huì)將所有的子進(jìn)程的句柄存起來(lái),以后進(jìn)行進(jìn)程間通訊用。

那么 我將所有的客戶端的鏈接存起來(lái)存成數(shù)組,每當(dāng)一個(gè)客戶端發(fā)送消息時(shí),我就遍歷這個(gè)客戶端數(shù)組,將消息群發(fā)一遍,不久實(shí)現(xiàn)了聊天室了嗎?

然后就,服務(wù)端代碼成了這個(gè)樣子

  1. <?php 
  2. $map = array();//客戶端集合 
  3. $server = new swoole_websocket_server("0.0.0.0"9501); 
  4.  
  5. $server->on('open', function (swoole_websocket_server $server, $request) { 
  6. global $map;//客戶端集合 
  7. $map[$request->fd] = $request->fd;//***連上時(shí)存起來(lái) 
  8. }); 
  9.  
  10. $server->on('message', function (swoole_websocket_server $server, $frame) { 
  11. global $map;//客戶端集合 
  12. $data = $frame->data; 
  13. foreach($map as $fd){ 
  14. $server->push($fd , $data);//循環(huán)廣播 
  15. }); 
  16.  
  17. $server->on('close', function ($ser, $fd) { 
  18. echo "client {$fd} closed\n"
  19. }); 
  20.  
  21. $server->start(); 

哈哈 , 我覺(jué)得這樣就大功告成了,結(jié)果發(fā)現(xiàn)自己是 圖樣圖森破

大家可以自己試試,運(yùn)行php后 , 瀏覽器打開(kāi)兩個(gè)頁(yè)面,看看console.log的內(nèi)容是什么

運(yùn)行良好,可是并沒(méi)有實(shí)現(xiàn)我們說(shuō)的那種聊天效果。

找找原因吧。

我***反映看看$map里面是什么,就輸出看看,結(jié)果發(fā)現(xiàn)這個(gè)map里面只有一個(gè)元素。

唉,不對(duì)啊,我這是全局變量,難道不應(yīng)該是有幾個(gè)客戶端鏈接,就有幾個(gè)元素嗎?

這是怎么回事啊,竟然沒(méi)有保存到所有客戶端id?

到了這一步,我解決不了map變量的這個(gè)問(wèn)題了,然后我就想看看那個(gè)fd是什么東西,

老規(guī)矩 var_dump輸出 , 發(fā)現(xiàn)fd就是 int類型的數(shù)字,并且是自增的

這好辦了,不就是數(shù)字嘛

于是呼,我就這樣做

變量存不了,我搞不定,我存文本里嘛。

最終版 websocket.php

  1. <?php 
  2.  
  3. $server = new swoole_websocket_server("0.0.0.0"9501); 
  4.  
  5. $server->on('open', function (swoole_websocket_server $server, $request) { 
  6. file_put_contents( __DIR__ .'/log.txt' , $request->fd); 
  7. }); 
  8.  
  9. $server->on('message', function (swoole_websocket_server $server, $frame) { 
  10. global $client; 
  11. $data = $frame->data; 
  12. $m = file_get_contents( __DIR__ .'/log.txt'); 
  13. for ($i=1 ; $i<= $m ; $i++) { 
  14. echo PHP_EOL . ' i is ' . $i . ' data is '.$data . ' m = ' . $m; 
  15. $server->push($i, $data ); 
  16.  
  17. }); 
  18.  
  19. $server->on('close', function ($ser, $fd) { 
  20. echo "client {$fd} closed\n"
  21. }); 
  22.  
  23. $server->start(); 

再次打開(kāi)html文件,多個(gè)頁(yè)面進(jìn)行輸入觀察,ok,可以了。

當(dāng)然,作為聊天室,我這寫(xiě)的也過(guò)于簡(jiǎn)陋了,界面大家自己可以寫(xiě)的好看一些(因?yàn)槲覒械膶?xiě)界面)

還有,每次的發(fā)送聊天的記錄,應(yīng)該存起來(lái),這樣,如果有新的連接連過(guò)來(lái)的時(shí)候,先把以前的聊天記錄發(fā)過(guò)去,這樣,我想體驗(yàn)更好一些

然后,大家可以愉快的聊天了。哈哈

責(zé)任編輯:chenqingxiang
相關(guān)推薦

2015-07-06 10:42:18

PHP聊天室應(yīng)用

2023-02-10 08:16:48

WebSocket簡(jiǎn)易聊天室

2011-12-15 11:11:51

JavaNIO

2020-12-07 09:01:58

冪等系統(tǒng)f(f(x)) =f(

2009-11-04 16:13:18

ADO.NET數(shù)據(jù)表

2020-06-16 08:47:53

磁盤(pán)

2024-12-11 07:00:00

面向?qū)ο?/a>代碼

2025-03-13 06:22:59

2009-11-16 10:53:30

Oracle Hint

2022-07-26 14:53:10

WebSocket網(wǎng)絡(luò)通信協(xié)議

2022-08-22 08:32:17

招聘函數(shù)string

2021-01-18 05:59:21

開(kāi)發(fā)桌面版應(yīng)用技術(shù)熱點(diǎn)

2024-08-19 08:29:40

2024-06-19 10:41:06

2024-06-25 12:25:12

LangChain路由鏈

2009-11-16 09:53:56

PHP上傳類

2023-07-23 18:47:59

Docker開(kāi)源

2021-12-01 06:50:50

Docker底層原理

2022-12-16 09:55:50

網(wǎng)絡(luò)架構(gòu)OSI

2025-01-21 07:39:04

Linux堆內(nèi)存Golang
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品自在在线观看 | 久久亚洲欧美日韩精品专区 | 精品动漫一区 | 国产激情一区二区三区 | 四虎影院在线播放 | 91久久北条麻妃一区二区三区 | 九一视频在线观看 | 久久精品国产一区 | 色狠狠一区 | 懂色一区二区三区免费观看 | 毛片片| 99re在线视频免费观看 | 日本视频中文字幕 | 91精品久久久久久久久中文字幕 | 99热播放| 成人福利电影 | 色综合成人网 | 91精品国产91久久久久久密臀 | 精品中文字幕一区二区 | 中文字幕一区在线观看视频 | 国产精品99久久久久 | 欧美激情 亚洲 | 午夜视频导航 | 欧美日日日日bbbbb视频 | 精品久久久久久亚洲国产800 | av激情在线 | 9999视频| 毛片一级片 | 欧美精品一区二区三区在线播放 | 伊人免费网 | 精品日韩 | 黄片毛片在线观看 | 国产一区二区精品在线 | 一区二区三区av | 色男人的天堂 | 男人的天堂亚洲 | 在线亚洲一区 | 久久久久精 | 精品成人佐山爱一区二区 | 亚洲精品亚洲人成人网 | 欧美一区二区大片 |