问题描述
|
我有一种情况,我需要根据另一个浏览器的输入来更新一个浏览器窗口。现在,我正在使用WebSockets,并且运行良好。
现在,我想使用PHP而不是浏览器将数据发送到WebSocket(因此,使用ws://代替ws://)。换句话说,我想使用PHP而不是JavaScript模拟WebSocket.send()调用。
我有以下似乎无效的代码(未调用onmessage):
if (
function_exists(\'socket_create\') AND
$sock = socket_create(AF_INET,SOCK_DGRAM,SOL_UDP) AND
$sock_data = socket_connect($sock,\"127.0.0.1\",12345)
) {
$msg = \"hello world\";
$sock_data = socket_set_option($sock,SOL_SOCKET,SO_broADCAST,1); //Set
$sock_data = socket_write($sock,$msg,strlen($msg)); //Send data
socket_close($sock); //Close socket
}
解决方法
这是完成的过程:
http://permalink.gmane.org/gmane.comp.lang.javascript.nodejs/18088
$host = \'localhost\'; //where is the websocket server
$port = 9000;
$local = \"http://localhost/\"; //url where this script run
$data = \'hello world!\'; //data to be send
$head = \"GET / HTTP/1.1\".\"\\r\\n\".
\"Upgrade: WebSocket\".\"\\r\\n\".
\"Connection: Upgrade\".\"\\r\\n\".
\"Origin: $local\".\"\\r\\n\".
\"Host: $host\".\"\\r\\n\".
\"Content-Length: \".strlen($data).\"\\r\\n\".\"\\r\\n\";
//WebSocket handshake
$sock = fsockopen($host,$port,$errno,$errstr,2);
fwrite($sock,$head ) or die(\'error:\'.$errno.\':\'.$errstr);
$headers = fread($sock,2000);
fwrite($sock,\"\\x00$data\\xff\" ) or die(\'error:\'.$errno.\':\'.$errstr);
$wsdata = fread($sock,2000); //receives the data included in the websocket package \"\\x00DATA\\xff\"
fclose($sock);
,为了将数据发送到套接字,您需要使用fsockopen在指定端口打开与套接字的连接。如果连接成功,则只需使用fwrite
但是,您将把数据发送到WebSocket服务器。服务器会将您视为客户端,并且由于您未提供HTTP标头,因此期望成功进行身份验证-您的连接将被拒绝。
由于您没有说出谁应该接收您要发送的消息(所有用户或特定用户或完全不同的东西),而又不知道您的目标是什么-很难进一步解释您的目标应该做。,WebSockets不仅仅是将原始数据发送到TCP套接字,还有很多其他功能。
好的,首先,您正在使用UDP套接字,其中WebSockets使用TCP。 WebSockets是一个完整的通信协议,类似于HTTP,因此您需要遵循该协议,首先需要执行一个握手步骤,然后将头添加到所有通信中。这并不困难,但是我在这里不做详细介绍。
您可以从此处获得两个选择,或者在php中实现WebSockets协议,或者使用像这样的预构建库:http://code.google.com/p/phpwebsocket/
我并不粗鲁,也不是刻薄,但是将来,请尝试快速进行Google搜索。谷歌搜索“ PHP WebSockets”后,找到了我链接的库。,最重要的部分是消息需要在现有套接字上发送,这意味着您不能调用socket_connect,fsockopen或PHP中的任何其他函数来尝试未经请求的客户端连接。这不是websocket的事情,而是网络编程中的基本概念。
在phpwebsocket上会是这样的:
$msg = \"hello world\";
$phpwebsocket->send($user->socket,$msg);
其中\'$ phpwebsocket \'是PHP WebSocket对象,$ user-> socket是已连接用户,该用户已与javascript WebSocket()优先连接,而send()是WebSocket对象中的一种将对消息进行正确编码的方法放入框架中(或应尽快将其放入)。
但是,如果出于任何原因要使用PHP的websockets连接到websocket服务器,则需要查看https://github.com/nicokaiser/php-websocket。如果您对当前的解决方案感到满意,则链接中的服务器将不会有任何重要性,但是该软件包还包含一个PHP Websocket客户端类,这是您所需要的。,结帐棘轮
您可以将诸如telnet之类的内容与popen / proc_open用于与套接字服务器进行通信。