Socket.io 客户端连接到服务器但立即触发 "connect_error" 事件并不断重新连接
Socket.io client connects to server but instantly triggers the "connect_error" event and continuous reconnecting
问题是 socket.io 客户端建立了到服务器的连接(在 nginx 反向代理之后),但是“connect_error”回调立即在客户端上触发。在本地主机上,服务器运行良好,但在服务器上它没有建立正确的连接。
附加信息:
socket.io 服务器和反向代理都已 dockerized。 TCP 握手似乎有效,但问题是立即访问“connect_error”回调,并且客户端开始一遍又一遍地重新连接。
客户代码:
io = require("socket.io-client");
const socket = io.connect("https://api.messboot.at/socket.io", {
transports: ["websocket"],
});
socket.on("connect_error", (error) => {
console.log("connection error!");
console.log(error);
});
Socket.io 服务器代码:
import { Logger } from '@nestjs/common';
import { Socket, Server } from 'socket.io';
import {
MessageBody,
OnGatewayConnection,
OnGatewayDisconnect,
OnGatewayInit,
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
} from '@nestjs/websockets';
import { GpsDTO } from '@dto/gps.dto';
import { GpsService } from '@services/gps/gps.service';
interface GpsMessage {
timestamp_executed: string;
session_id: string;
latitude: number;
longitude: number;
speed: number;
accuracy: number;
}
@WebSocketGateway(8000, {
transport: ['websocket'],
allowUpgrades: false,
//namespace: '/socket.io/gps',
})
export class GPSGateway
implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
constructor(private service: GpsService) {}
private logger: Logger = new Logger('WebsocketGateway');
@WebSocketServer() wss: Server;
afterInit(server: Server) {
this.logger.log('Initialized:');
}
handleConnection(client: Socket) {
this.logger.log(`Client with id: ${client.id} connected!`);
}
handleDisconnect(client: Socket) {
this.logger.log(`Client with id: ${client.id} disconnected!`);
}
@SubscribeMessage('to_server')
handleMessage(@MessageBody() message: GpsMessage): void {
this.wss.emit('from_server', message);
const gps_data: GpsMessage = {
timestamp_executed: message.timestamp_executed,
session_id: message.session_id,
latitude: message.latitude,
longitude: message.longitude,
speed: message.speed,
accuracy: message.accuracy,
};
this.service.saveGpsDto(GpsDTO.from(gps_data));
console.log(message);
}
}
服务器日志:
[Nest] 30 - 05/12/2021, 8:39:49 AM [WebsocketGateway] Client with id: FKwbAKhcTWvBFrPAAABM connected!
有人知道问题出在哪里吗?
提前致谢...
问题是客户端和服务器不兼容,因为 socket.io 的 nestjs 依赖项依赖于 socket.io 的版本 2.x.x 和客户端([= 的版本 3 13=]) 一遍又一遍地尝试重新连接,但没有明确的迹象表明为什么会发生这种情况,直到我在 Github 上发现了一个与此相关的问题。 Nestjs 已宣布在他们的下一个主要版本 (v 8) 中支持 socket.io 版本 3,直到那时你可以使用一个适配器代码:https://github.com/nestjs/nest/issues/5676
问题是 socket.io 客户端建立了到服务器的连接(在 nginx 反向代理之后),但是“connect_error”回调立即在客户端上触发。在本地主机上,服务器运行良好,但在服务器上它没有建立正确的连接。
附加信息:
socket.io 服务器和反向代理都已 dockerized。 TCP 握手似乎有效,但问题是立即访问“connect_error”回调,并且客户端开始一遍又一遍地重新连接。
客户代码:
io = require("socket.io-client");
const socket = io.connect("https://api.messboot.at/socket.io", {
transports: ["websocket"],
});
socket.on("connect_error", (error) => {
console.log("connection error!");
console.log(error);
});
Socket.io 服务器代码:
import { Logger } from '@nestjs/common';
import { Socket, Server } from 'socket.io';
import {
MessageBody,
OnGatewayConnection,
OnGatewayDisconnect,
OnGatewayInit,
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
} from '@nestjs/websockets';
import { GpsDTO } from '@dto/gps.dto';
import { GpsService } from '@services/gps/gps.service';
interface GpsMessage {
timestamp_executed: string;
session_id: string;
latitude: number;
longitude: number;
speed: number;
accuracy: number;
}
@WebSocketGateway(8000, {
transport: ['websocket'],
allowUpgrades: false,
//namespace: '/socket.io/gps',
})
export class GPSGateway
implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
constructor(private service: GpsService) {}
private logger: Logger = new Logger('WebsocketGateway');
@WebSocketServer() wss: Server;
afterInit(server: Server) {
this.logger.log('Initialized:');
}
handleConnection(client: Socket) {
this.logger.log(`Client with id: ${client.id} connected!`);
}
handleDisconnect(client: Socket) {
this.logger.log(`Client with id: ${client.id} disconnected!`);
}
@SubscribeMessage('to_server')
handleMessage(@MessageBody() message: GpsMessage): void {
this.wss.emit('from_server', message);
const gps_data: GpsMessage = {
timestamp_executed: message.timestamp_executed,
session_id: message.session_id,
latitude: message.latitude,
longitude: message.longitude,
speed: message.speed,
accuracy: message.accuracy,
};
this.service.saveGpsDto(GpsDTO.from(gps_data));
console.log(message);
}
}
服务器日志:
[Nest] 30 - 05/12/2021, 8:39:49 AM [WebsocketGateway] Client with id: FKwbAKhcTWvBFrPAAABM connected!
有人知道问题出在哪里吗?
提前致谢...
问题是客户端和服务器不兼容,因为 socket.io 的 nestjs 依赖项依赖于 socket.io 的版本 2.x.x 和客户端([= 的版本 3 13=]) 一遍又一遍地尝试重新连接,但没有明确的迹象表明为什么会发生这种情况,直到我在 Github 上发现了一个与此相关的问题。 Nestjs 已宣布在他们的下一个主要版本 (v 8) 中支持 socket.io 版本 3,直到那时你可以使用一个适配器代码:https://github.com/nestjs/nest/issues/5676