【问题标题】:Unable to connect Javascript client to PHP server using websockets无法使用 websocket 将 Javascript 客户端连接到 PHP 服务器
【发布时间】:2020-08-17 13:54:49
【问题描述】:

我有一台 PHP 服务器正在监听来自一些远程 PHP 客户端的“消息”。一旦服务器接收到消息,服务器应该使用本地主机上的 javascript Web 套接字更新 GUI。 PHP 服务器正在正确接收消息。问题是当服务器尝试将消息发送到 Javascript 客户端时,我不断收到错误消息“Firefox 无法在 ws://127.0.0.1:6002/ 建立与服务器的连接。”和错误代码 1006。

PHP 服务器代码。

// socket used between PHP clients and PHP server
$srv_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($srv_socket, SOL_SOCKET, SO_REUSEADDR, TRUE);
socket_bind($srv_socket, "10.10.10.2", 6001);
socket_listen($srv_socket);

// socket used between PHP server and Web GUI (javascript)
$gui_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($gui_socket, SOL_SOCKET, SO_REUSEADDR, TRUE);
socket_bind($gui_socket, "127.0.0.1", 6002);
socket_listen($gui_socket);

while (TRUE) {

    // get message from PHP client
    $client_socket = socket_accept($srv_socket);
    $message = socket_read($client_socket, 250);
    socket_close($client_socket);
    if ($message != NULL) {

        echo "Message Received: " . $message . ".";

        // send message to GUI
        $gui_client_socket = socket_accept($gui_socket);
        socket_write($gui_client_socket, $message, strlen($message));
        echo "Message Sent to GUI.";

    }

}

Javascript 客户端代码。

$(document).ready(function(){
    var socket = new WebSocket("ws://127.0.0.1:6002/"); 
    socket.onopen = function(ev) {
        alert('socket connection opened properly');
    };
    socket.onmessage = function(ev) {
        var message = ev.data;
        alert("message arrived!");
    };
    socket.onerror = function(error){
        alert("Error: " + error.message);
    };
    socket.onclose = function(ev){
        alert("Connection closed: " + ev.code);
    }; 
});

PHP 服务器的输出是 收到消息:{"msg":"Hello World!"}。 消息发送到 GUI。

Javascript 的输出是两个警报: 第一个警报:“错误:未定义” 第二个警报:“连接关闭:1006”

请注意我正在运行 Debian,我已经用 iptables -F 刷新了我的 iptables,然后为端口 6001 和 6002 添加了两条规则。

iptables -A INPUT -p tcp -m tcp --dport 6001 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 6002 -j ACCEPT

重要 我从终端而不是从 Apache 运行 PHP 服务器。例如:php -q /var/www/html/php_server.php,而 Javascript 客户端正试图在 ws://localhost:6002/ 上打开一个 websocket

我错过了什么吗?做错什么了吗?最终,我需要那个 javascript 客户端来接收来自 PHP 服务器的消息。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 我认为该链接提供了对 1006 错误的详细描述,但除了“无法打开套接字”之外,它没有指出特定原因。我希望在同一问题上苦苦挣扎的人可以就这个问题分享一些见解。感谢您的回复。
  • 这是我第一次看到一个套接字服务器监听 2 个端口。我会尝试只设置和测试一个,然后在第一个工作正常后进行第二个。
  • 感谢您的回答,这也是我第一次实现PHP服务器。我已经调试了很多次,我知道如果我将 javascript web socket 更改为 ws://echo.websocket.org,它会工作得很好。我试图找出问题所在。
  • 您收到socket connection opened properly 警报了吗?如果不是,服务器是问题。我之前没有注意到,但是您正在关闭套接字,然后尝试对其进行写入。

标签: javascript php websocket


【解决方案1】:

我找到了答案。使用 Javascript 客户端建立 Web 套接字时,我错过了握手标头。请参考此question 并查找有关问题的 PHP - Server 代码;因为这是在 Javascript 客户端和 PHP 服务器之间创建 Web 套接字并解决了我的问题的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2020-09-13
    • 2013-12-09
    • 2017-11-30
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多