WebSocket服务器端脚本调用

时间:2014-05-04 14:52:17

标签: php sockets websocket

WebSocket教程说有两件事是必需的:

* 1。应启动服务器端脚本:

  
    

php -q path / to / server.php

  

* 2。客户端脚本应该打开套接字连接:

  

var socket = new WebSocket('ws://example.com:12345 / server.php');

但请求'ws://example.com/server.php'将再次运行服务器脚本。它将导致运行多个服务器实例。或客户端请求将导致服务器端错误(socket_bind(...)=>已绑定)。

有人可以解释这种沟通模式吗?谢谢。

4 个答案:

答案 0 :(得分:5)

Websockets是持久连接(它们被设计为持久连接,但您仍然可以滥用关闭帧来重新建立连接...)。 (在网站中,websockets是有状态的,而不是无状态的HTTP)

因此,当您通过new WebSocket('ws://example.com:12345/server.php');打开websocket连接时,您的Web服务器或套接字侦听脚本将接受该连接。 (网络服务器必须使用与您使用的代码相同的语言,对于websockets而言,因为它们是持久连接,而不是无状态的类似HTTP的进出周期......)

然后它会读取您的握手请求并决定这些信息到必须路由请求的位置。

因此,您的路由器通常应该调用一些回调来根据指定的路径委托初始化。您通常不使用websockets路由到真实文件。您可以更多地定义要路由到其处理程序的某些路径。

然后,您通常将客户端套接字映射到用户。 (例如,将数据发送给某个用户)

因此,对于您的后续传入数据,您只需将客户端状态信息传递给先前根据路由确定的回调。


尽管如此,有了你的问题,你很难猜出你的问题到底是什么。如果它没有回答您的问题,请在您的问题中更准确。 如何运作有点过于笼统。

答案 1 :(得分:1)

根据我对websocket的处理:当您运行服务器脚本时,它将监听并响应来自example.com域名,12345端口和{{1}的所有请求}协议。

因此,当您从客户端调用ws://时,它会向正在运行的server.php发送请求。在任何情况下,它都不会导致服务器再次运行。

我不了解详细信息但是,当我尝试运行websocket服务器脚本时,它拦截了来自new WebSocket('ws://example.com:12345/server.php');的每个请求。我甚至不需要在客户端调用中指定ws://example.com:12345

但是,如果你想让事情变得干净,或者你可能有几个不同的脚本,我认为这很重要吗?

无论如何,只是在我的locahost尝试websocket之后的猜测;我根本不是一个websocket专家:)

答案 2 :(得分:1)

基本上,WebSocket定义了一个全双工单插槽连接,通过它可以在客户端和服务器之间发送消息。

你应该读到这个:

http://es.wikipedia.org/wiki/WebSocket

和此:

http://www.websocket.org/

答案 3 :(得分:1)

好的,如果你的server.php文件正常工作,你可以看到它使用netstat在端口上监听,那么首先只需使用ws://example.com:1234进行连接。接下来你说“客户端等待很长时间并且什么也得不到”,如果是这种情况,最有可能是握手过程出现问题。我第一次开始在php中使用套接字时遇到了同样的问题。当javascript连接到websocket时,它会在标题中发送一个特定的键,如下所示:

Sec-WebSocket-Key: 9a9dufa9dfa90fa

你必须从标题中添加一个字符串(是的,你必须使用那个确切的字符串258EA...)然后sha1()然后将它转换为base64,如下所示:< / p>

if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match))
    $key = $match[1];
$acceptKey = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$acceptKey = base64_encode(sha1($acceptKey, true));

接下来,您需要使用其他信息将其写回套接字,以便javascript与服务器进行握手:

$upgrade = "HTTP/1.1 101 Switching Protocols\r\n".
           "Upgrade: websocket\r\n".
           "Connection: Upgrade\r\n".
           "Sec-WebSocket-Accept: $acceptKey".
           "\r\n\r\n";
socket_write($the_socket, $upgrade); //$the_socket comes from socket_accept()

之后握手应该完成,并且在你的javascript中.onopen()函数应该触发,你可以在客户端和服务器之间来回发送数据:

var connection = new WebSocket('ws://127.0.0.1:1234');
connection.onopen = function () {
    console.log('Connection Opened');
    connection.send('Ping'); // Send the message 'Ping' to the server
};