我正在开发一个websocket游戏。一般流程如下:
在第三步中,一切在桌面上都可以正常运行,但是当我在Android上的Chrome中运行代码时,通常不会收到(但有时是)第三步中来自服务器的事件。以后会收到事件。
在服务器上,如果我在接收加入游戏的请求(第2步)和发出游戏的当前状态(第3步)之间增加了两秒钟的延迟,那么它在Android上也能正常工作。
在客户端上,创建套接字连接,并在componentDidMount中订阅事件,如下所示:
componentDidMount() {
this.socket = socketIO(getKanjiGameServer());
const { location } = this.props;
const query = queryString.parse(location.search);
if (!query.username) {
window.$('#chooseUsernameModal').modal();
return;
}
this.socket.on(socketEvents.Server.NO_SUCH_GAME, () => {
window.$('#noSuchGameModal').modal();
});
/*
* A bunch of other events get subscribed here
*/
this.socket.emit(socketEvents.Client.JOIN_GAME, query);
}
我在错误的地方打开连接吗?根据我的测试,我有信心服务器正在发出消息,但客户端中的处理程序没有执行。
我有一个在线测试服务器here,完整的相关客户端代码为here,服务器代码为here。 (我在服务器代码中添加了延迟,因此在测试服务器上可能不会发生此问题...假设幻数对您来说足够长)
服务器发出之前的断点会被命中,但是客户端事件处理程序中的断点不会因加入游戏后立即发送的事件而受到命中。
编辑:基于注释,我将发出JOIN_GAME消息的代码更改为以下代码:
console.warn('test');
this.socket.on('error', err => {
console.warn(err);
});
this.socket.on('connect_error', err => {
console.warn(err);
});
this.socket.on('reconnect_error', err => {
console.warn(err);
});
this.socket.on('connect', () => {
this.socket.emit(socketEvents.Client.JOIN_GAME, query);
});
在远程调试中,“测试”警告会打印到控制台,但不会打印任何错误。我也尝试像以前一样在'connect'事件之外发出事件,但是也没有以这种方式打印错误。和以前一样,这在台式机上的Chrome中始终可以运行,但有时仅在Android上的Chrome中可以运行,除非我在响应JOIN_GAME消息之前在服务器中添加了延迟。