使用WebSocketSharp对接GameLift Fleet时连接异常求助
AWS GameLift Fleet WebSocket 连接故障排查指南(WebSocketSharp)
一、GameLift 核心配置必查项
1. Fleet 端口映射与服务器注册端口
- 创建Fleet时必须配置服务器进程端口,该端口必须和你的WebSocket服务监听端口完全一致(比如你用的2022)。
- 同时在Fleet的端口映射规则中,将客户端访问端口(建议和服务器端口一致,避免混淆)映射到服务器进程端口。
- 服务器启动后,必须调用GameLift的
ProcessReady接口注册进程,注册时指定的端口必须和WebSocket监听端口匹配:var processParams = new ProcessParameters( port: 2022, logPath: "./game-lift-logs", onTerminate: () => { /* 资源清理逻辑 */ }, onHealthCheck: () => true ); GameLiftServerAPI.ProcessReady(processParams);
2. 安全组配置
- 确保Fleet关联的EC2安全组入站规则开放TCP 2022端口,允许客户端IP段(测试阶段可暂时设为
0.0.0.0/0)访问。 - 安全组出站规则需允许实例访问GameLift服务(TCP 443),否则服务器进程无法完成注册。
3. VPC 网络配置
- 如果Fleet部署在私有子网,需配置NAT网关确保实例能与GameLift服务通信;同时若客户端从公网访问,需确保实例有公网IP或绑定弹性IP。
- 检查VPC路由表,确认公网流量能正确路由到实例所在子网。
二、WebSocketSharp 代码层面排查
1. 服务端监听地址
- 必须让WebSocketServer监听
0.0.0.0而非localhost或127.0.0.1,否则仅能本地访问,外部客户端无法连接:// 正确初始化方式 _instance.mServer = new WebSocketServer(2022); // 显式指定监听地址的写法 _instance.mServer = new WebSocketServer("ws://0.0.0.0:2022");
2. 客户端连接地址
- 客户端必须使用GameLift返回的游戏会话IP和端口拼接WebSocket地址,禁止硬编码实例IP。通过
CreateGameSession或DescribeGameSession接口获取IpAddress和Port字段:// 示例:从GameLift获取会话信息后拼接URI string uri = $"ws://{gameSession.IpAddress}:{gameSession.Port}/your-service-name";
3. 心跳与超时配置
- 客户端和服务端都需配置Ping心跳,避免因无数据传输被网络设备断开连接:
// 客户端配置 webSocket.PingInterval = TimeSpan.FromSeconds(30); webSocket.EmitOnPing = true; // 服务端配置 _instance.mServer.PingInterval = TimeSpan.FromSeconds(30);
4. 错误日志采集
- 在服务端会话类中重写错误和关闭事件,打印详细信息:
public class GameSessionWebSocket : WebSocketServerSession { protected override void OnError(ErrorEventArgs e) { Console.WriteLine($"WebSocket Error: {e.Message} | Exception: {e.Exception?.StackTrace}"); base.OnError(e); } protected override void OnClose(CloseEventArgs e) { Console.WriteLine($"WebSocket Closed: Code={e.Code} | Reason={e.Reason}"); base.OnClose(e); } } - 客户端同样在
OnError事件中打印错误,定位是连接阶段还是连接后的异常断开。
三、AWS 网络连通性测试
1. 端口连通性验证
- 客户端使用
telnet或nc命令测试游戏会话IP的2022端口:telnet <game-session-ip> 2022 - 若无法连通,优先排查安全组、VPC路由或Fleet端口映射配置。
2. 实例内部端口监听检查
- 登录EC2实例,执行命令确认WebSocket服务是否在监听指定端口:
netstat -tulpn | grep 2022 - 若无结果,说明服务端未正确启动WebSocketServer,或端口被其他进程占用。
3. GameLift 实例状态检查
- 在GameLift控制台查看Fleet实例状态,确保实例处于
ACTIVE,服务器进程处于READY。 - 查看实例日志(控制台->实例详情->日志),检查是否存在服务启动失败、GameLift注册失败等错误信息。
四、常见问题总结
- 服务器进程注册端口与WebSocket监听端口不一致,导致GameLift无法路由流量。
- WebSocketServer仅监听本地地址,外部无法访问。
- Fleet端口映射配置错误,客户端访问端口未映射到服务器监听端口。
- 安全组/VPC配置限制了外部流量访问实例端口。
内容的提问来源于stack exchange,提问作者조희재
相关产品推荐
相关产品推荐

