通过WebSockets连接本地主机并访问远程主机

3

我正在使用由Google托管的这个WebSocket。

var host = "ws://localhost:12345/websocket/server.php";
try{
  socket = new WebSocket(host);
  log('WebSocket - status '+socket.readyState);
  socket.onopen    = function(msg){ log("Welcome - status "+this.readyState); };
  socket.onmessage = function(msg){ log("Received: "+msg.data); };
  socket.onclose   = function(msg){ log("Disconnected - status "+this.readyState); };
}
catch(ex){ log(ex); }

这个能够与远程主机一起工作吗?
var host = "ws://example.com:12345/websocket/server.php";

我想使用CURL和websockets来POST更改。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://xxxx.com/ccc.php");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_CAINFO, "esoftcareers.crt");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 
http_build_query(array('PHPSESSID' => $id ,'query' => $resultQuery,'operator' => $operator,'database' => DATABASE)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
curl_close ($ch);

原则上应该可以,但可能取决于许多因素(远程机器上的端口是否开放和可用等)。 - Jeff Sisson
你的意思是想要使用Websockets连接两个Web服务器?Websockets是一种客户端服务器协议。客户端库已经内置在Google Chrome中。看起来您已经找到了在服务器端构建的参考文档(http://code.google.com/p/phpwebsocket/)。如果您想要在PHP中构建一个客户端库,那将是一个更大的任务。 - BA_Webimax
有错误吗?curl 启用了吗?这是简单但好的问题。 - Rafael Soufraz
2个回答

1

首先,让我们从这里开始回答:

我想使用Websockets通过CURL POST更改。

WebSocket是协议,主要用于需要与服务器进行双向通信的基于浏览器(而不是服务器到服务器)的应用程序。您想要在curl中使用http/https协议(因为post是HTTP协议的方法),这些协议是TCP层上的层。 WebSocket也是分层在TCP之上。因此,您要使用一个TCP层来覆盖另一个TCP层。现在您不能这样做,因为php curl不支持websocket协议。我认为这在未来仍将是不可变的。

此外,post是具有正文和一个响应的HTTP协议方法。WebSocket是没有正文并且使用一系列帧的协议。因此,在websocket协议中没有类似于post方法的任何东西,这是它的特点。

您不能在使用websocket时将内容发送到服务器并忘记它,因为socket意味着通信。您必须在使用websocket时与服务器进行通信。通过AJAX的HTTP协议中,您可以将某些东西发送到服务器并使用异步回调来处理响应。如果关闭websocket,您将失去响应中的所有数据。

您可以通过使用长轮询请求来模拟curl websocket。但这仍然是HTTP协议,而不是websocket。所以现在curl无法使用websocket协议。

第二点。关于websocket协议来源(跨域)。是的,websocket可以使用跨域,因为它使用基于源的安全模型。因此,如果您尝试通过WebSocket从Origin请求标头中不存在的域打开与Web服务器的连接,则服务器将返回适当的HTTP错误。通常默认情况下为403 HTTP错误。否则一切都应该很好。


0

服务器和客户端都应该知道websocket的实现方式,并且第一次握手应该得出他们都知道。通过从服务器的ws:响应中的第一行下一行返回..."Upgrade: WebSocket\r\n"。如果没有这样的响应,期望使用websocket的客户端应该理解当前联系服务器不支持websocket,并回退到正常通信。

附加说明: 普通的curl命令无法从此协议中受益,除非您有一个更新了此协议实现的高级curl命令。请查看thisthis


4
谁对这个回答投了反对票,我要求他们证明这个回答是错的。(Websocket 是一个新的协议,应该实现它来实现这一点。没有什么奇迹是浏览器能够实现未来将开发的预见协议) - Siva Tumma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接