doutuoji8418 2011-05-27 18:13
浏览 132

无法使用新的websocket协议发送消息

I am trying to develop a websocket server in php.

Here is what I have done so far : (server part)

$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: (.*)
#', $message, $matches);

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

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

";

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 */

(client part)

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');
    }
};

The first socket_write works perfectly (for the handshake) and the open event is triggered correctly. But the second socket_write doesn't work. I tried to do a ws.send on the open event with a second socket_read in server part, it doesn't work neither.

Thank you if you have an idea !

  • 写回答

2条回答 默认 最新

  • douangzhao4108 2011-06-26 20:14
    关注

    I think it is a INVALID_STATE_ERR: DOM Exception 11 meaning a sync problem. Try this in your client:

    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 will fail because it is an asynchronous websocket.

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料