6

我有一种情况,我需要根据另一个浏览器窗口的输入来更新一个浏览器窗口。现在我正在使用 WebSockets,它工作得很好。

现在我想使用 PHP 而不是浏览器将数据发送到 WebSocket(所以不是 ws://,而是使用 PHP 代码)。换句话说,我想使用 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
    } 
4

5 回答 5

4

这是如何完成的:

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);
于 2011-04-19T13:47:58.160 回答
1

为了向套接字发送数据,您需要使用fsockopen在指定端口打开与套接字的连接。如果连接成功,你需要做的就是使用fwrite

但是,您将把数据发送到 WebSocket 服务器。服务器会将您视为客户端,并且由于您没有提供成功验证所需的 HTTP 标头 - 您的连接将被拒绝。

由于您没有说谁应该接收您尝试发送的消息(所有用户或特定用户或完全不同的东西),所以不知道您的目标是什么 - 很难进一步解释您应该做什么。

于 2011-04-19T14:07:27.157 回答
-1

最重要的部分是消息需要在现有套接字上发送,这意味着您不能调用 socket_connect、fsockopen 或 PHP 中的任何其他函数来尝试主动连接到客户端。这不是 websocket 的事情——这是网络编程中的一个基本概念。

在 phpwebsocket 上它会是这样的:

$msg = "hello world";
$phpwebsocket->send($user->socket, $msg);

其中 '$phpwebsocket' 是 PHP WebSocket 对象,$user->socket 是使用 javascript WebSocket() 连接priory 的已连接用户,而 send() 是 WebSocket 对象中的一个方法,它将正确地将消息编码为框架(或者应该很快需要)。

但是,如果出于某种原因您想使用 PHP 中的 websockets 连接到 websocket 服务器,您需要查看https://github.com/nicokaiser/php-websocket。如果您对当前的解决方案感到满意,链接中的服务器将不重要,但该软件包还包含您需要的 PHP Websocket 客户端类。

于 2012-12-08T23:56:47.127 回答
-1

Checkout ratchet 您可以使用诸如带有 popen/proc_open 的 telnet 与套接字服务器进行通信。

于 2013-10-12T05:19:22.593 回答
-1

WebSockets 不仅仅是将原始数据发送到 TCP 套接字。

好的,首先,您使用的是 UDP 套接字,而 WebSocket 使用 TCP。WebSockets 是一个完整的通信协议,类似于 HTTP,因此您需要遵循该协议,首先需要执行一个握手步骤,并且需要将标头添加到所有通信中。这并不难,但我不打算在这里详细介绍。

您有两个选择,在 php 中实现 WebSockets 协议,或者使用像这样的预构建库:http ://code.google.com/p/phpwebsocket/

我不是粗鲁或刻薄,但在未来,请尝试快速谷歌搜索。我链接的那个库是在谷歌搜索“PHP WebSockets”后找到的。

于 2011-04-19T01:45:07.633 回答