У меня есть приложение websocket, работающее на yii2.Вот моя сторона сервера (используя https://github.com/consik/yii2-websocket):
class ChatServer extends WebSocketServer
{
public function init()
{
parent::init();
$this->on(self::EVENT_CLIENT_CONNECTED, function(WSClientEvent $e) {
$user = User::findById(\Yii::$app->user->identity->id);
$e->client->id = $user->id;
});
$this->on(self::EVENT_CLIENT_DISCONNECTED, function(WSClientEvent $e){
});
}
protected function getCommand(ConnectionInterface $from, $msg)
{
$request = json_decode($msg, true);
return !empty($request['action']) ? $request['action'] : parent::getCommand($from, $msg);
}
public function commandChat(ConnectionInterface $client, $msg)
{
$request = json_decode($msg);
$result = ['message' => ''];
if (!isset($request->recipient_id) || !isset($request->message)) {
$client->send(json_encode(['success' => false]));
}
$user = User::findById(\Yii::$app->user->identity->id);
if (!$user->isFriend($request->recipient_id)) {
$client->send(json_encode(['success' => false]));
}
$message = new Message();
$message->sender_id = $user->id;
$message->receiver_id = $request->receiver_id;
$message->text = $request->message;
if ($message->save())
{
$result['message'] = 'Sended.';
foreach($this->clients as $chatClient) {
if ($chatClient->id == $message->receiver_id) {
$chatClient->send( json_encode([
'type' => 'newMessage',
'message' => $message->text
]) );
}
}
}
else {
$result['message'] = 'Some error here.';
}
$client->send( json_encode($result) );
}
}
И это моя сторона клиента:
$(function() {
var chat = new WebSocket('ws://localhost:8079/');
chat.onopen = function(e) {
console.log(e);
console.log('connected!');
};
chat.onclose = function(event) {
console.log('closed');
};
$('#btnSend').click(function() {
if ($('#message').val()) {
chat.send( JSON.stringify({'action' : 'chat', 'message' : $('#message').val()}) );
} else {
alert('Enter the message')
}
})
});
Но когда я открываю эту страницу, я получаю это в консоли:
connected!
closed
И когда я попытался отправить сообщение через chat.send
, я получил WebSocket is already in CLOSING or CLOSED state.
. Что мне здесь делать? Почему мой websocket закрывается так быстро?
И какое лучшее решение для веб-сокетов на yii2?
PS Отредактируйте мои js:
var chat = new WebSocket('ws://localhost:8080/');
chat._original_send_func = chat.send;
chat.send = function(data) {
if(this.readyState == 1) {
this._original_send_func(data);
}
else {
console.log('No')
}
}.bind(chat);
И когда я попытался отправить сообщение, readyState
не равно 1. Я не знаю почему.