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(…)=>已绑定)。

谁能解释一下这种交流模式?谢谢你。

Websockets是持久连接(它们被设计为持久的,尽管你仍然可以滥用关闭帧来重新建立连接…)(请记住,websockets是有状态的,而不是无状态的HTTP)

所以,当你通过new WebSocket('ws://example.com:12345/server.php');打开一个websocket连接时,你的web服务器或socket监听脚本会接受这个连接。(web服务器必须使用与您使用的代码相同的语言,因为websockets是持久连接,而不是无状态的http -out周期..)

然后它会读取你的握手请求,并根据这些信息决定请求必须路由到哪里。

所以,你的路由器通常应该调用一些回调来根据指定的路径委派初始化。你通常不会用websockets将路由到真正的文件。你需要定义一些路径来路由到它们的处理程序。

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

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


虽然,对于你的问题,很难猜测你的问题到底是什么。如果没有回答你的问题,请把问题提得更准确一些。它是如何工作的有点太一般化了。

好的,如果你的server.php文件工作,你可以看到它监听端口使用netstat,然后首先使用ws://example.com:1234连接。接下来你说"客户端等待了很长时间却一无所获",如果是这样的话,很可能是握手过程出了问题。我第一次在php中使用套接字时遇到了同样的问题。当javascript连接到websocket时,它会在报头中发送一个特定的键,它看起来像这样:

Sec-WebSocket-Key: 9a9dufa9dfa90fa

你必须把它从头中拉出来,附加一个字符串(是的,你必须使用确切的字符串258EA...),然后sha1(),然后将其转换为base64,像这样:

if(preg_match("/Sec-WebSocket-Key: (.*)rn/", $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 Protocolsrn".
           "Upgrade: websocketrn".
           "Connection: Upgradern".
           "Sec-WebSocket-Accept: $acceptKey".
           "rnrn";
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
};

从我对websocket的理解来看:当你运行服务器脚本时,它将侦听并响应来自example.com域名的所有请求,在12345端口上并使用ws://协议。

因此,当您从客户端调用new WebSocket('ws://example.com:12345/server.php');时,它将向正在运行的server.php发送请求。在任何情况下,它都不会导致服务器运行第二次。

我不知道细节,但是,当我试图运行websocket服务器脚本时,它截获了来自ws://example.com:12345的每个请求。我甚至不需要在客户机调用中指定/server.php

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

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

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

你应该读这个:

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

:

http://www.websocket.org/

相关内容

  • 没有找到相关文章

最新更新