如何以编程方式(使用PHP)调用WebSocket?

| 我有一种情况,我需要根据另一个浏览器的输入来更新一个浏览器窗口。现在,我正在使用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用于与套接字服务器进行通信。

要回复问题请先登录注册