Не удается отправить сообщение с новым протоколом веб-сокета - PullRequest
2 голосов
/ 27 мая 2011

Я пытаюсь разработать сервер websocket на php.

Вот что я сделал до сих пор: (серверная часть)

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, "localhost", 10000);
socket_listen($server);

$client = socket_accept($server);

$message = socket_read($client, 5000);

$matches = array();

preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $message, $matches);

$new_key = new_key($matches[1]);

$new_message = "HTTP/1.1 101 Switching Protocols\r\n";
$new_message .= "Upgrade: websocket\r\n";
$new_message .= "Connection: Upgrade\r\n";
$new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";

socket_write($client, $new_message, strlen($new_message));

$new_message = "Test message !";

socket_write($client, $new_message, strlen($new_message));

function new_key($key)
{
    $key .= "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
    $key = sha1($key);
    $new_key = '';

    for ($i = 0; $i < strlen($key); $i+=2)
    {
        $new_key .= chr(intval($key[$i] . $key[$i+1], 16));
    }

    $new_key = base64_encode($new_key);

    return $new_key;
}

/* End of file server.php */

(клиентская часть)

window.onload = function() {
    var ws = new WebSocket('ws://localhost:10000');

    ws.onopen = function() {
        alert('Connection open !');

        setInterval(function() {
            ws.send('lol');
        }, 1000);
    }

    ws.onclose = function() {
        alert('WebSocket close !');
    }

    ws.onmessage = function(e) {
        alert(e.data);
    }

    ws.onerror = function(e) {
        alert('Error');
    }
};

Первый socket_write работает отлично (для рукопожатия), и событие open запускается правильно. Но второй socket_write не работает. Я попытался сделать ws.send для события open со вторым socket_read в серверной части, оно также не работает.

Спасибо, если у вас есть идея!

Ответы [ 2 ]

0 голосов
/ 20 октября 2013

У меня была похожая проблема. После проверки этого проекта здесь https://github.com/srchea/PHP-Push-WebSocket я заметил функцию "кодировать" в этом файле https://github.com/srchea/PHP-Push-WebSocket/blob/master/lib/Server.class.php перед отправкой сообщения.

Так что попробуйте изменить это

socket_write($client, $new_message, strlen($new_message));
$new_message = "Test message !";
socket_write($client, $new_message, strlen($new_message));

к этому

socket_write($client, $new_message, strlen($new_message));
$new_message = "Test message !";
socket_write($client, chr(129) . chr(strlen($new_message)) ."". $new_message);
0 голосов
/ 27 июня 2011

Я думаю, что это исключение INVALID_STATE_ERR: DOM 11, означающее проблему синхронизации. Попробуйте это в вашем клиенте:

var test = function(){
    var myWebSocket = new WebSocket('ws://localhost:10000');
    myWebSocket.onopen = function(e){
        alert('connection open');
        this.send('test1');
        this.send('test2');
    }
    myWebSocket.onmessage = function(e){ alert('message ' + e.data) };
    myWebSocket.onclose = function(e){ alert('connection closed'); this.close(); };
    myWebSocket.send('test3');
};

test3 завершится неудачно, потому что это асинхронный веб-сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...