yso2 websocket закрывается сразу после открытия - PullRequest
0 голосов
/ 09 июня 2018

У меня есть приложение 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. Я не знаю почему.

1 Ответ

0 голосов
/ 11 июня 2018

По моему опыту, SocketServer не работает в функции init() сразу после подключения клиента.Одной из причин этого является то, что если вы запускаете сервер с использованием php-cli, то причиной сбоя будет строка $user = User::findById(\Yii::$app->user->identity->id);, поскольку в Консольном приложении отсутствует компонент идентификации пользователя, это вызывает исключение, которое отключает сервер.

...