Web Socket Cannot send message and disconnected from Game Lift

199 views Asked by At

I developed a game lift back-end server using a websocket sharp. The local test function provided by GameLift worked fine, but Web socket communication is not possible with the game session of Fleet created by the GameLift server.

To be exact, the connection is initially shown on the client as successful, but it is said that the connection was immediately disconnected. And even if the connection is marked as successful, no messages reach the server.

I wonder if there is anything I need to communicate with the AWS game lift server using a web socket. Please help me.

  • Fleet type : spot instance
  • Not use TLS
  • EC2 Port was set as |2022|TCP|0.0.0.0/0

Client Code for Connection

public static void AddService(string hostName, int port, string serviceName, WebSocketClientSession socketSession, bool overTls = false)
{
    Dictionary<string, WebSocket> serviceMap = _instance.mServiceMap;
    
    string uri = overTls
        ? $"wss://{hostName}:{port}/{serviceName}"
        : $"ws://{hostName}:{port}/{serviceName}";
    Debug.Log(uri);
    
    WebSocket webSocket = new WebSocket(uri);
    if (overTls)
    {
        webSocket.SslConfiguration.EnabledSslProtocols = SslProtocols.Tls;
    }
    
    webSocket.OnOpen += socketSession.OnOpen;
    webSocket.OnClose += socketSession.OnClose;
    webSocket.OnMessage += socketSession.OnMessage;
    webSocket.OnError += socketSession.OnError;

    serviceMap[serviceName] = webSocket;
}
public static async void ConnectAsync(string serviceName, Action<bool> onCompleted)
{
    Dictionary<string, WebSocket> serviceMap = _instance.mServiceMap;
    WebSocket webSocket = serviceMap[serviceName];
    
    await Task.Run(webSocket.Connect);
    if (webSocket.IsAlive)
    {
        // webSocket.EmitOnPing = true;
        onCompleted?.Invoke(true);
        return;
    }

    onCompleted?.Invoke(false);
}

Server Code for listening

public static void StartServer()
{
    _instance.mServer.Start();
    _instance.mHasStarted = true;
}

public static void StopServer()
{
    _instance.mServer.Stop();
    _instance.mHasStarted = false;
}

public static void AddService<T>(string serviceName) where T : WebSocketServerSession, new()
{
    WebSocketServer server = _instance.mServer;
    server.AddWebSocketService<T>($"/{serviceName}");
}

public static void RemoveService(string serviceName)
{
    WebSocketServer server = _instance.mServer;
    server.RemoveWebSocketService($"/{serviceName}");
}

At first, communication was attempted using TCP and UDP, but the same phenomenon occurred as a web socket. Various searches and attempts were made for a week, but there was no harvest. There were so few questions about the game lift that there were no similar cases.

Even if it is not a game lift service, I would like to know if there are additional elements necessary for AWS connection.

1

There are 1 answers

0
Buffoonism On

It could be lots of different things. TLS mismatches, WebSocket parameter negotiation mismatches, authentication etc.

I'd suggest digging deeper into what is happening on the wire. Hopefully, it'll make things clearer, and lead you to a solution.

A Man-In-The-Middle proxy, like Burp, would be able to see into the HTTP connection, and the follow-up WebSocket negotiation. All you need to do is point your app at it via the proxy settings, and install the Burp CA certificate into your app platform (so it can intercept the TLS).

Otherwise, if that's not an option, you can always use Wireshark (though you won't be able to see inside the TLS).