我已经为Google Cloud部署了一个实时绘图应用程序,其中多个用户也可以看到其他用户绘制和加入。
我的代码遇到的问题是这部分:
var socket = io.connect("http://bla-bla-1234.appspot.com:8080");
当地址保持这样时,我经常会在IE上进行测试时向控制台显示错误,例如WebSocket Error: Incorrect HTTP response. Status code 400, Bad Request
或在Firefox上进行测试时Firefox can't establish a connection to the server at wss://bla-bla-1234.appspot.com/socket.io/?EIO=3&transport=websocket&sid=ULP5ZcoQpu0Y_aX6AAAB.
。
我已经更改了var socket = io.connect();
的参数,只是为了看看我是否能看到一些实时绘图,在某些情况下我能够但不能平滑绘图,屏幕上会出现多行一个用户,当你所做的只是画一次线。并经常会出现错误,例如:Websocket connection to '//bla-bla-1234.appspot.com/socket.io/?EIO=3&transport=websocket&sid=dJqZc2ZutPuqU31HAAX' failed: Error during WebSocket handshake: Unexpected response code: 400
。
以下是允许连接到服务器以及允许将数据显示给client.js文件上连接的所有客户端的内容,这不是所有代码,但我觉得这部分与此问题最相关:< / p>
var socket = io.connect("bla-bla-1234.appspot.com");
socket.on('draw_line', function (data) {
var line = data.line;
context.beginPath();
context.strokeStyle = "#33ccff";
context.lineJoin = "round";
context.lineWidth = 5;
context.moveTo(line[0].x, line[0].y);
context.lineTo(line[1].x, line[1].y);
context.stroke();
});
我试图在参数中添加一个端口(8080),但只是为了收到如下错误:
XMLHttpRequest: Network Error 0x2efd, Could not complete the operation due to error 00002efd.
我想我猜我的问题是,如何在参数中确定正确的地址并使其按预期(实时)顺利工作?
提前致谢。
答案 0 :(得分:8)
我联系了支持部门,因为我遇到了同样的问题。
答案很简单:Google App Engine的托管虚拟机目前不支持WebSockets。
在实现该功能之前,可能使其工作的唯一方法是强制Socket.io使用长轮询。
他们告诉我。但我没有尝试过。在我的情况下,我会尝试切换到Google Compute Engine。
修改:我已收到Google提供的其他信息。让我引用@ jmdobry的回答:
目前,仅支持
ws://
协议(不是wss://
),并且为了使用websockets,您需要获取运行您的应用的计算机的外部IP地址。不幸的是,socket.io在他们的工具中做了一些不起作用的东西,尽管我们有一个手动使用websockets并访问元数据以获取外部ip地址的例子:https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/appengine/websockets
编辑2 我设法让我的应用在Google Compute Engine上运行。它有点复杂和耗时,说实话,我并不了解100%的步骤。但是我按照本教程的这一部分进行了一些微小的更改,比如所有文件中的项目名称,并且进展顺利:https://cloud.google.com/nodejs/getting-started/run-on-compute-engine