摘要:今天來做一個(gè)簡(jiǎn)單的聊天室支持換房間支持私信的寫的代碼有點(diǎn)渣里面有很多不是很好的地方畢竟我只是一個(gè)野生程序猿環(huán)境地址樣子差不多是這個(gè)樣子的我不想把代碼發(fā)到我的服務(wù)器上因?yàn)檫@個(gè)項(xiàng)目太小了很垃圾而且怕被攻擊這里有錄的一個(gè)演示視頻沒有廣告的你們可以
今天來做一個(gè)簡(jiǎn)單的聊天室,支持換房間,支持私信的. 寫的代碼有點(diǎn)渣,里面有很多不是很好的地方.畢竟我只是一個(gè)野生程序猿.
環(huán)境: php7.0 apache 2.4 swoole 1.9 redis 4.0
bilibili : https://www.bilibili.com/vide...
github地址:https://github.com/buffge/buf...
樣子差不多是這個(gè)樣子的:
我不想把代碼發(fā)到我的服務(wù)器上,因?yàn)檫@個(gè)項(xiàng)目太小了.很垃圾.而且怕被攻擊.
這里有錄的一個(gè)演示視頻(bilibili沒有廣告的).你們可以看一下,
你們也可以直接到github 把源碼下載下來, 絕對(duì)有用.不好用找我.
把我的ip地址 192.168.1.109改成你們的ip就能用了.
我這里做了3個(gè)房間,首次登錄是在公共聊天室.可以隨意切換到文人雅士專區(qū),當(dāng)然了也可以選擇去死肥宅那一欄.
流程差不多是這樣:
登錄一個(gè)聊天室
1.1 后臺(tái)觸發(fā)open 事件. 此時(shí)判斷是初次登錄還是已注冊(cè)之后刷新的,如果是注冊(cè)刷新的話 將session中保存的用戶 信息發(fā)送給swoole服務(wù)器 并進(jìn)行注冊(cè).然后返回注冊(cè)成功或者失敗,還有當(dāng)前在線的用戶列表 如果是新用戶,那么就直接將當(dāng)前所在的聊天室的所有用戶列表發(fā)送給客戶端.兩者都會(huì)插入新數(shù)據(jù)進(jìn)redis數(shù)據(jù)庫
1.2 此時(shí)如果不注冊(cè) 那么就無法發(fā)消息給當(dāng)前分組,如果注冊(cè)的話 先去網(wǎng)站后臺(tái)驗(yàn)證session 驗(yàn)證碼 并將使用的用戶名
和時(shí)間戳和鹽進(jìn)行sha256信息摘要.然后向swooleWebSocket服務(wù)器請(qǐng)求注冊(cè).此時(shí)服務(wù)器會(huì)判斷 如果用戶信息的前6個(gè)字母 是tokenR 并且當(dāng)前未注冊(cè) 如果token 驗(yàn)證成功那么就插入redis數(shù)據(jù)庫,并通知客戶注冊(cè)成功,再通知客戶所在組的所有用戶 添加用戶用戶(就是當(dāng)前在線那一欄) 代碼差不多是這樣的
此時(shí)已經(jīng)登錄成功了,可以隨意切換分組了.每次切換分組用戶的編號(hào)都會(huì)重設(shè).因?yàn)閟woole規(guī)定就是這樣,只要斷開連接,
之后的連接就是一個(gè)新連接,比如之前的socket號(hào) 是1 那么斷開后下一個(gè)就是2.但是根據(jù)session 判斷是可以保存住用戶名,
而使刷新之后還是之前的用戶名.(但是這)
2.1
公共聊天室的人聊天只有公共聊天室人看見,文人雅士專區(qū)只有文人雅士看見.
2.2
私信單聊只有對(duì)方可以看見,別人都看不見 這個(gè)主要就是將發(fā)送的信息前6個(gè)字母寫成sendTo 代碼流程差不多是這樣的.哎呀我發(fā)現(xiàn)流程好少啊.還是看后臺(tái)吧.
后臺(tái)主要就是我新建的一個(gè)叫WebS的類.這個(gè)類繼承了SwooleWebsocketServer
并新增一些邏輯方法
主要如下:
1. checkRegisterName() 檢查用戶名是否可以用 原型 checkRegisterName(Redis $redis, string $user_name, uffstring $reload) : boolean 2. sendToPerson() 發(fā)送消息給單個(gè)用戶 原型 sendToPerson(integer $fd, string $mes, integer $type, string $sendTo = "", string $user_name = "", Redis $redis = null) 3. sendToGroup() 發(fā)送消息給單個(gè)組 原型 sendToGroup(int $frameFd, Redis $redis, string $user_name, int $type, string $mes = "", string $group = "public") 4. getOnlineUsersList() 獲取當(dāng)前所有已注冊(cè)的用戶列表 原型我就不寫了,下面貼github.源碼注釋好了 5. checkToken() 檢查token 是否正確 6. judgeMesEventType() 判斷用戶發(fā)送的消息 分析他想要干嘛
沒了. 是不是超簡(jiǎn)單. 有了swoole 這樣簡(jiǎn)單.而且這個(gè)是國人開發(fā)的! 你們?nèi)woole官網(wǎng)可以學(xué)習(xí),文檔很多,而且swoole功能能強(qiáng)大,
我只看了一點(diǎn)點(diǎn)websocket 那一章的,其他的基本沒看,因?yàn)榭床欢? 還有redis 普通用法很簡(jiǎn)單.我就是上慕課網(wǎng)> 看了20分鐘這個(gè)視頻.>http://www.imooc.com/video/14315 我這里就是把redis 當(dāng)作mysql來用的.
然后只用了hash 這一個(gè)類型,用了兩三個(gè)函數(shù),其他的都不會(huì).什么加鎖 只讀之類的都沒有弄
phpredis擴(kuò)展百度安裝.
這個(gè)是一次性完成的,從昨天夜里開始做,做到早上,沒有檢查,我就看能正常運(yùn)行,控制臺(tái)沒有異常信息 就發(fā)上來了.
要是你們遇到問題,我能解決的一定解決. 另外 請(qǐng)大家支持國產(chǎn)優(yōu)秀作品 swoole!http://swoole.com
swoole 官方qq交流群 193772828 我在里面屬于菜逼那種.你們學(xué)習(xí)swoole 有問題可以去群里交流.
再說一遍 視頻地址(7分鐘 演示)
bilibili : https://www.bilibili.com/vide...
github地址:https://github.com/buffge/buf...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/23299.html
摘要:開始聊天發(fā)送聊天信息時(shí)消息,這樣后端就知道是誰要發(fā)給誰,根據(jù)用戶名去找到具體的線程去單獨(dú)推送消息,實(shí)現(xiàn)單聊。前端待完善左側(cè)聊天列表沒有實(shí)現(xiàn),每搜索一個(gè)在線用戶,應(yīng)該動(dòng)態(tài)顯示在左側(cè),點(diǎn)擊該用戶,動(dòng)態(tài)顯示右側(cè)聊天窗口進(jìn)行消息發(fā)送。 上節(jié)課講了群聊,這次來說說單聊,單聊要比群聊復(fù)雜點(diǎn),但是代碼也不是很多,主要是前端顯示比較麻煩點(diǎn)。 效果:showImg(https://segmentfaul...
閱讀 2737·2021-10-19 11:41
閱讀 2503·2021-09-01 10:32
閱讀 3453·2019-08-29 15:21
閱讀 1903·2019-08-29 12:20
閱讀 1232·2019-08-29 12:13
閱讀 710·2019-08-26 12:24
閱讀 2613·2019-08-26 10:26
閱讀 928·2019-08-23 18:40