libGDX : 为 GWT 正确使用 websocket

libGDX : Correctly using websocket for GWT

这几天我一直在努力使用 websockets 进行基本的客户端/服务器通信

我的客户端是一个 java 客户端 libGDX 我的服务器是一个基本的 java 服务器

我的主要目标是将我的客户端编译成 HTML5 以使用 websockets 与我的服务器通信。

我在 google 上搜索时尝试了以下解决方案:

1 似乎是最好的解决方案,但是,它似乎没有 TCP_NODELAY 套接字设置(这对我来说是必不可少的)

2 seemed an other good solution too, But it relies on http://code.google.com/p/gwt-ws/(这时候没明白这个意思)

3是我选择的,一个简单的WebSocketJavaAPI让我写客户端和服务器真的很轻松。 它在桌面和 android 上工作得很好,但是当我尝试 html:dist 时,gradle 给我关于 websocket 的错误,它不是继承等...

我的主 build.gradle 文件包含每个项目(核心、桌面、android、html)的这一行:编译 "org.java-websocket:Java-WebSocket:1.3.7"

所以继续我的主要问题:如何在 ligdx 中与使用 GWT 编译的客户端正确建立 websocket 连接,另外 TCP_NODELAY?

我的客户端很简单 class :

package com.mygdx.game;
import java.net.URI;
import java.nio.ByteBuffer;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.handshake.ServerHandshake;

public class WebSocketsNet extends WebSocketClient {

    public WebSocketsNet(URI serverUri, Draft draft) {
        super(serverUri, draft);
    }

    public WebSocketsNet(URI serverURI) {
        super(serverURI);
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        send("Hello, it is me. Mario :)");
        System.out.println("new connection opened");
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("closed with exit code " + code + " additional info: " + reason);
    }

    @Override
    public void onMessage(String message) {
        System.out.println("received message: " + message);
    }

    @Override
    public void onMessage(ByteBuffer message) {
        System.out.println("received ByteBuffer");
    }

    @Override
    public void onError(Exception ex) {
        System.err.println("an error occurred:" + ex);
    }}

最后我找到了一种让它工作的方法,所以我post在这里给感兴趣的人一个答案。

我用了https://github.com/czyzby/gdx-lml/tree/master/websocket

特别是示例包,并严格遵循 build.gradle 和不同 xml 文件中需要添加的所有内容,所以现在它可以工作了!

所以总结:

  • 服务器监听 websockets java-web-socket
  • LIBGDX 客户端使用 gdx-websockets 连接到服务器(注意不同的构建 gradle 文件和 xml !!)

希望能帮到和我有同样问题的人!

根据 https://bugs.webkit.org/show_bug.cgi?id=102079 and https://groups.google.com/forum/#!topic/native-client-discuss/T8zdrMjiTAE, found via https://github.com/websockets/ws/issues/791 and https://github.com/varspool/Wrench/pull/104,大多数浏览器已经使用 TCP_NODELAY。至少从 websocket 标准来看,您无法在客户端影响这一点 - 在服务器上可能有更多选项。

如果客户端已经设置了TCP_NODELAY,您也可以在服务端设置,确保双方尽快发送小消息。

在 等问题中提出的另一个想法是立即响应发送的每条消息,以便网络堆栈尽快刷新所有剩余消息。