javascript - 无法使用 websocket 将 Javascript 客户端连接到 PHP 服务器
问题描述
我有一台 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 服务器的输出是 Message Received: {"msg":"Hello World!"}。消息发送到 GUI。
Javascript 的输出是两个警报: 第一个警报:“错误:未定义”第二个警报:“连接关闭:1006”
请注意,我正在运行 Debian,我已经刷新了我的 iptables,iptables -F
然后为端口 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 服务器的消息。任何帮助将不胜感激,谢谢。
解决方案
我找到了答案。使用 Javascript 客户端建立 Web 套接字时,我错过了握手标头。请参考这个问题并在问题上查找 PHP - Server 代码;因为这是在 Javascript 客户端和 PHP 服务器之间创建 Web 套接字并解决了我的问题的正确方法。
推荐阅读
- amazon-s3 - 如何将 EBS 上 Rails 应用程序上的入站安全组限制为仅来自我的应用程序(在 S3 上)并防止其他服务器访问我的 API?
- oauth-2.0 - 使用 Microsoft Graph 创建日历事件:ErrorAccessDenied
- r - 以 polylineDecorator 为例的传单插件和传单代理
- python - 如何根据 OpenCV、Python 中的图像大小调整 cv2.putText 的文本大小?
- java - 为什么 Spring Metrics 显示初始堆大小大于最大大小?
- python-3.x - Pandas - 加入重复的行
- c - 使用 txt 文件填充循环双链表
- javascript - 如何在javascript中显示来自服务器的图像?
- linux - 无法从已安装的驱动器克隆存储库
- javascript - Express 呈现 index.html 但没有其他页面