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/