laravel5.4實現實時聊天室
一、修改laravel的廣播驅動
修改 .env中:
BROADCAST_DRIVER=redis
二、建立laravel事件廣播
比如要建立一個傳送聊天訊息的事件,則
php artisan make:event SendChat
後在app/events裡面會有SendChat.php
SendChat.php:
//由於該事件需要廣播,則該類需要實現ShouldBroadcast
Class SendChat implements ShouldBroadcast {
//然後將需要廣播的資料以public形式寫在此類作為成員屬性
public $input;
//new物件時存入的資料
public function __construct($input) {
$this->input = $input;
}
public function broadcastOn() {
//公共channel
return ['test-channel'];
}
}
最後將會得到如下資料:
頻道:test-channel
資料:{"event":"App\Events\UserSignUp","data":{"input":"xulibin","socket":null},"socket":null}
Redis版本:
若不用laravel 的broadcast,則可以用Redis(它也有釋出和訂閱功能)$data = ['event' => 'SendChat','data' => ['input' => 'xlb'] ]; Redis::publish('test-channel',json_encode($data));
最後將會得到如下資料:
頻道:test-channel
資料:{"event":"SendChat","data":{"input":"xlb"}}
三、建立node伺服器,接受laravel事件廣播,再轉廣播給前端client,此處Node伺服器是佔用了3000埠,待會client也要監聽這個3000埠。
1、另外還需要引入socket.io和ioredis
npm install socket.io ioredis --save
2、建立socket.js(這次是建立在專案根目錄,也可其他目錄)
var server = require('http').Server();
var io = require('socket.io')(server);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('test-channel');
redis.on('message',function(channel,message){
message = JSON.parse(message);
console.log(channel+':'+message.event);
//這裡是以“頻道:事件”的方式去傳送,需要接受此事件的client就接受此格式的事件
//test-channel:SendChat
io.emit(channel+':'+message.event,message.data);
});
server.listen(3000);
然後一定要開啟node伺服器
node socket.js //(如果js位置不同,也要加上前面的目錄)
四、Client
引入vue.js(非必要),socket.is.js,vue-resource(非必要)
<script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
<script src="https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js"></script>
<script src="https://cdn.bootcss.com/vue-resource/1.3.4/vue-resource.min.js"></script>
<div id="container">
<h1>New Users:</h1>
<ul>
<li v-for="chat in chatList">@{{chat}}</li>
</ul>
<div>
<input type="text" v-model="chatInput"/>
<button @click="submit">提交</button>
</div>
</div>
<script>
//監聽伺服器的3000埠
var socket = io('http://192.168.10.10:3000');
new Vue({
el:'#container',
data:{
users:[],
chatInput:'',
submitUrl: 'http://localhost:8000/api/submit' ,
chatList:[]
},
mounted:function(){
//socket.on('test-channel:UserSignUp',function(data){
socket.on('test-channel:App\\Events\\UserSignUp',function(data){
console.log(data);
this.chatList.push(data.input);
}.bind(this));
},
methods:{
submit(){
var that = this;
that.$http.post(
this.submitUrl,
{'input':this.chatInput}
).then(function(response){ //介面返回資料
},function(error){
})
}
}
});
</script>
然後該按鈕提交後,服務端的程式碼如下
$input = $request->input('input');
//觸發傳送聊天資訊事件
event(new SendChat($input));
return $input;
五、流程圖
相關文章
- Node.js+websocket+mongodb實現即時聊天室Node.jsWebMongoDB
- 原生Node 實現聊天室
- SpringBoot 實戰 (十七) | 整合 WebSocket 實現聊天室Spring BootWeb
- Websocket 直播間聊天室教程 - GoEasy 快速實現聊天室WebGo
- 聊天室應用開發實踐(二):實現基於 Web 的聊天室Web
- 用go實現併發聊天室Go
- Swoole+React 實現的聊天室React
- js程式碼實現多人聊天室JS
- node+socket.io 實現一個聊天室
- C++ 實現基於TCP的聊天室C++TCP
- tp5+ajax+快取實現聊天室快取
- 用node實現一個簡單的聊天室——websocket實踐Web
- 實戰swoole【聊天室】
- nodjs+socket.io+webRTC實現聊天室實錄之環境配置JSWeb
- socket.io+express實現聊天室的思考(一)Express
- Node.js中TCP及聊天室的實現Node.jsTCP
- WinForm的Socket實現簡單的聊天室 IMORM
- Python基於Socket實現簡易多人聊天室Python
- 基於Netty實現的WebSocket聊天室--支援多人同時線上及定時心跳檢測NettyWeb
- uniapp專案實踐總結(十五)使用websocket實現簡易聊天室APPWeb
- Springboot+Vue實現線上聊天室專案-登入、註冊介面的實現Spring BootVue
- SpringBoot2 整合 WebSocket 簡單實現聊天室功能Spring BootWeb
- SignalR簡版web聊天室(實現過程分析篇)SignalRWeb
- Java實現多執行緒區域網聊天室Java執行緒
- 使用輪詢&長輪詢實現網頁聊天室網頁
- 基於SpringBoot+STOMP協議實現的web聊天室Spring Boot協議Web
- spring boot+vue實現H5聊天室客服功能Spring BootVueH5
- Qt實現網路聊天室(客戶端,服務端)QT客戶端服務端
- [記錄]利用workerman在laravel中實現網頁聊天室Laravel網頁
- redis有序集合實現實時排名Redis
- Java進階:基於TCP通訊的網路實時聊天室JavaTCP
- 用node實現一個簡單的聊天室—— 升級版
- 用Java程式碼實現一個簡單的聊天室功能Java
- 重構 JAVA 聊天室 —— CS 模式的簡單架構實現Java模式架構
- 透過websocket,實現遊戲陪玩系統的聊天室Web遊戲
- 小程式實現實時聊天IM功能
- 實現地圖實時定位,拯救“路痴”地圖
- Springboot+Vue實現線上聊天室專案-整合springSecurity配置實現登入的許可權控制Spring BootVueGse