-
-
Save sebastiaanluca/c80db73d720c3307b4867e6af86369ef to your computer and use it in GitHub Desktop.
| const PRIVATE_CHANNEL = 'yourprivatehashedchannelid' | |
| // | |
| var io = require('socket.io-client') | |
| var host = window.location.host.split(':')[0] | |
| var socket = io.connect('//' + host + ':8000', {secure: true, rejectUnauthorized: false}) | |
| socket.on('connect', function () { | |
| console.log('CONNECT') | |
| socket.on('event', function (data) { | |
| console.log('EVENT', data) | |
| }) | |
| socket.on('messages.new', function (data) { | |
| console.log('NEW PRIVATE MESSAGE', data) | |
| }) | |
| socket.on('disconnect', function () { | |
| console.log('disconnect') | |
| }) | |
| // Kick it off | |
| // Can be any channel. For private channels, Laravel should pass it upon page load (or given by another user). | |
| socket.emit('subscribe-to-channel', {channel: PRIVATE_CHANNEL}) | |
| console.log('SUBSCRIBED TO <' + PRIVATE_CHANNEL + '>'); | |
| }) |
| <?php | |
| namespace App\Events; | |
| use Illuminate\Contracts\Broadcasting\ShouldBroadcast; | |
| use Illuminate\Queue\SerializesModels; | |
| class NewMessage extends Event implements ShouldBroadcast | |
| { | |
| use SerializesModels; | |
| public $from; | |
| public $to; | |
| public $message; | |
| public function __construct() | |
| { | |
| $this->from = 'Bond'; | |
| $this->to = 'Bean'; | |
| $this->message = 'You don\'t say??'; | |
| } | |
| public function broadcastOn() | |
| { | |
| return ['yourprivatehashedchannelid', 'thiscouldbeaglobalchanneltoo']; | |
| } | |
| /** | |
| * Get the broadcast event name. | |
| * | |
| * @return string | |
| */ | |
| public function broadcastAs() | |
| { | |
| return 'messages.new'; | |
| } | |
| } |
| const SERVER_PORT = 8000 | |
| // | |
| var fs = require('fs') | |
| var https = require('https') | |
| var express = require('express') | |
| var app = express() | |
| var options = { | |
| key: fs.readFileSync('/etc/nginx/ssl/yourapp.key'), | |
| cert: fs.readFileSync('/etc/nginx/ssl/yourapp.crt'), | |
| } | |
| var server = https.createServer(options, app) | |
| var io = require('socket.io').listen(server) | |
| var redis = require('redis') | |
| var ioredis = require('socket.io-redis') | |
| // Multi-server socket handling allowing you to scale horizontally | |
| // or use a load balancer with Redis distributing messages across servers. | |
| io.adapter(ioredis({host: 'localhost', port: 6379})) | |
| // | |
| /* | |
| * Redis pub/sub | |
| */ | |
| // Listen to local Redis broadcasts | |
| var sub = redis.createClient() | |
| sub.on('error', function (error) { | |
| console.log('ERROR ' + error) | |
| }) | |
| sub.on('subscribe', function (channel, count) { | |
| console.log('SUBSCRIBE', channel, count) | |
| }) | |
| // Handle messages from channels we're subscribed to | |
| sub.on('message', function (channel, payload) { | |
| console.log('INCOMING MESSAGE', channel, payload) | |
| payload = JSON.parse(payload) | |
| // Merge channel into payload | |
| payload.data._channel = channel | |
| // Send the data through to any client in the channel room (!) | |
| // (i.e. server room, usually being just the one user) | |
| io.sockets.in(channel).emit(payload.event, payload.data) | |
| }) | |
| /* | |
| * Server | |
| */ | |
| // Start listening for incoming client connections | |
| io.sockets.on('connection', function (socket) { | |
| console.log('NEW CLIENT CONNECTED') | |
| socket.on('subscribe-to-channel', function (data) { | |
| console.log('SUBSCRIBE TO CHANNEL', data) | |
| // Subscribe to the Redis channel using our global subscriber | |
| sub.subscribe(data.channel) | |
| // Join the (somewhat local) server room for this channel. This | |
| // way we can later pass our channel events right through to | |
| // the room instead of broadcasting them to every client. | |
| socket.join(data.channel) | |
| }) | |
| socket.on('disconnect', function () { | |
| console.log('DISCONNECT') | |
| }) | |
| }) | |
| // Start listening for client connections | |
| server.listen(SERVER_PORT, function () { | |
| console.log('Listening to incoming client connections on port ' + SERVER_PORT) | |
| }) |
How can I receive message from client in Laravel?
Hi quochoangvp, make a emit function with your client and recive in your server with function on:
Client:
socket.emit('send-data', message);
Server:
socket.on('send-data', function (data) {
var serverUrl = "https://tuserver";
try{
request.post({
url: serverUrl + 'recive-message',
headers: {'Content-Type': 'application/json'},
form: {
message: data},
json: true
})
}catch(err){
}
});
Try with this example make your own function.
@gemins Your trick is helpful for me. Thanks.
Great Gist. Sorry if this is a silly question, noob here. How could I make sure a certain user couldn't or could subscribe to specific channels?
Please help to solve the problem. Here is my repo https://github.com/gasparyanyur/Laravel-SocketIo-Redis-Nodejs/.. In my case get-data event not works!
How can I receive message from client in Laravel?
- maker subscribe php file.
== subscribe.php
`<?php
//forever -c php subscribe.php
function f($redis, $chan, $msg) {
switch($chan) {
case 'chan-1':
print "get $msg from $chan\n";
break;
case 'chan-2':
print "get $msg FROM $chan\n";
break;
case 'chan-3':
break;
}
}
ini_set('default_socket_timeout', -1);
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
$redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f');
?>`
- use forever and listen subscribe.php
forever -c php subscribe.php
Create a new Redis channel using
var pub = redis.createClient()andpub.publish('check the docs for the right command here')to allow sending messages to Redis (and thus Laravel).