fix ratchet
This commit is contained in:
parent
eb1810ee9e
commit
9015904e63
@ -1,56 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace App\Console\Commands;
|
|
||||||
|
|
||||||
use Illuminate\Console\Command;
|
|
||||||
use Ratchet\Server\IoServer;
|
|
||||||
use Ratchet\Http\HttpServer;
|
|
||||||
use Ratchet\WebSocket\WsServer;
|
|
||||||
use App\Http\Controllers\WebSocketController;
|
|
||||||
use React\EventLoop\Factory;
|
|
||||||
use React\Socket\SecureServer;
|
|
||||||
use React\Socket\Server;
|
|
||||||
|
|
||||||
class WebSocketServer extends Command
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The name and signature of the console command.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $signature = 'websocket:init';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The console command description.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $description = 'Initializing Websocket server to receive and manage connections';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command instance.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the console command.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function handle()
|
|
||||||
{
|
|
||||||
$server = IoServer::factory(
|
|
||||||
new HttpServer(
|
|
||||||
new WsServer(
|
|
||||||
new WebSocketController()
|
|
||||||
)
|
|
||||||
),
|
|
||||||
8090
|
|
||||||
);
|
|
||||||
$server->run();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace App\Http\Controllers;
|
|
||||||
|
|
||||||
use Ratchet\MessageComponentInterface;
|
|
||||||
use Ratchet\ConnectionInterface;
|
|
||||||
|
|
||||||
class WebSocketController extends Controller implements MessageComponentInterface{
|
|
||||||
private $connections = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When a new connection is opened it will be passed to this method
|
|
||||||
* @param ConnectionInterface $conn The socket/connection that just connected to your application
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
function onOpen(ConnectionInterface $conn){
|
|
||||||
$this->connections[$conn->resourceId] = compact('conn') + ['user_id' => null];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is called before or after a socket is closed (depends on how it's closed). SendMessage to $conn will not result in an error if it has already been closed.
|
|
||||||
* @param ConnectionInterface $conn The socket/connection that is closing/closed
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
function onClose(ConnectionInterface $conn) {
|
|
||||||
$disconnectedId = $conn->resourceId;
|
|
||||||
unset($this->connections[$disconnectedId]);
|
|
||||||
foreach($this->connections as &$connection)
|
|
||||||
$connection['conn']->send(json_encode([
|
|
||||||
'offline_user' => $disconnectedId,
|
|
||||||
'from_user_id' => 'server control',
|
|
||||||
'from_resource_id' => null
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If there is an error with one of the sockets, or somewhere in the application where an Exception is thrown,
|
|
||||||
* the Exception is sent back down the stack, handled by the Server and bubbled back up the application through this method
|
|
||||||
* @param ConnectionInterface $conn
|
|
||||||
* @param \Exception $e
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
function onError(ConnectionInterface $conn, \Exception $e){
|
|
||||||
$userId = $this->connections[$conn->resourceId]['user_id'];
|
|
||||||
echo "An error has occurred with user $userId: {$e->getMessage()}\n";
|
|
||||||
unset($this->connections[$conn->resourceId]);
|
|
||||||
$conn->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Triggered when a client sends data through the socket
|
|
||||||
* @param \Ratchet\ConnectionInterface $conn The socket/connection that sent the message to your application
|
|
||||||
* @param string $msg The message received
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
function onMessage(ConnectionInterface $conn, $msg){
|
|
||||||
if(is_null($this->connections[$conn->resourceId]['user_id'])){
|
|
||||||
$this->connections[$conn->resourceId]['user_id'] = $msg;
|
|
||||||
$onlineUsers = [];
|
|
||||||
foreach($this->connections as $resourceId => &$connection){
|
|
||||||
$connection['conn']->send(json_encode([$conn->resourceId => $msg]));
|
|
||||||
if($conn->resourceId != $resourceId)
|
|
||||||
$onlineUsers[$resourceId] = $connection['user_id'];
|
|
||||||
}
|
|
||||||
$conn->send(json_encode(['online_users' => $onlineUsers]));
|
|
||||||
} else{
|
|
||||||
$fromUserId = $this->connections[$conn->resourceId]['user_id'];
|
|
||||||
$msg = json_decode($msg, true);
|
|
||||||
$this->connections[$msg['to']]['conn']->send(json_encode([
|
|
||||||
'msg' => $msg['content'],
|
|
||||||
'from_user_id' => $fromUserId,
|
|
||||||
'from_resource_id' => $conn->resourceId
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user