我有一台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的输出是两个警报: 第一警报:“错误:未定义” 第2条警报:“连接已关闭: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 /
我错过了什么吗?做错什么了吗?最终,我需要该javascript客户端才能从PHP服务器接收消息。谢谢您的任何帮助。
答案 0 :(得分:0)
我找到了答案。使用Javascript客户端建立Web套接字时,我缺少握手标头。请参考此https://www.jetbrains.com/help/mps/building-mps-language-plugins.html#,并在问题中查找PHP-服务器代码;因为这是在Javascript客户端和PHP服务器之间创建Web套接字并解决了我的问题的正确方法。