移动版Chrome中socket.emit无法工作(但在隐身模式下可以工作)

5
我有一个使用socket.io的应用程序,但是在移动端Chrome(Android和iOS)上无法使用socket.emit()。我可以看到浏览器中执行了socket.emit(),但是我的服务器端socket.on()中的console.log语句没有运行,因此我认为消息没有传递到那里。控制台中也没有错误信息。

有趣的是,在隐身模式下一切正常,而且其他移动浏览器(如Safari)的所有模式也都正常。

任何解决方案或调试帮助都将是有帮助的。

编辑:

客户端代码

$(document).ready(function(){
    socket = io();
    $(".check").on("submit", function(event){
        event.preventDefault();
        ga('send','event','evt','evt123');
        socket.emit('checkRoom', { rId: "12345", pId: "johndoe"});
    });
});

服务器端代码

io.on('connection', function(socket) {
    console.log('a user connected');

    socket.on('check',function(e){
        console.log('Entered check');
        socket.emit('check','server message');
    });
});

更正2:

我在客户端手动指定了socket.io-1.3.5.js文件(而不是使用默认的/socket.io/socket.io.js),并在控制台上开始看到此错误:

WebSocket connection to 'ws://mydomain.com/socket.io/?EIO=3&transport=websocket&sid=wr8UpsT45lrWHtpMACJs' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

我们可能需要查看相关的代码才能对这里发生了什么有任何想法。 - jfriend00
你是如何确定 socket.emit 在客户端起作用的?你是否在它之前或之后放置了一个 console.log?你仍然在服务器上收到 "a user connected" 的消息,这意味着 socket 已连接,但来自客户端的 emit 没有被接收到吗?尝试在服务器和客户端上都放置一些 socket.emit/on('test')(带有适当的控制台日志消息),触发它们而不需要任何交互,以查看通信是否至少在第一次联系时发生,或者问题是否开始出现。 - laggingreflex
@laggingreflex:我已经使用断点来查看代码是否到达了socket.emit。我尝试使用非常简单的代码来检查第一个联系是否发生,但我可以看到消息没有到达服务器。 - Deepak Joy Cheenath
1个回答

0

一些移动网络通过端口80代理请求,这可能会破坏Web套接字。这并不能解释为什么它在其他浏览器或隐身模式下工作,但您可以通过将服务器和客户端移动到连接不同端口(例如81)来测试此假设。


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