【问题标题】:libGDX : Correctly using websocket for GWTlibGDX:为 GWT 正确使用 websocket
【发布时间】:2018-06-18 10:12:46
【问题描述】:

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

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

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

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

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

2 似乎也是另一个很好的解决方案,但它依赖于http://code.google.com/p/gwt-ws/(此时它不明白这一点)

3 是我选择的,它是一个简单的 WebSocket Java API,让我可以非常轻松地编写客户端和服务器。 它在桌面和 android 上运行得很好,但是当我尝试 html:dist 时,gradle 给我关于 websocket 的错误,它不是继承等...

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

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

我的客户是一个非常简单的类:

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);
    }}

【问题讨论】:

  • 不幸的是,websockets 相当有限,您对它们的控制与原始套接字不同 - 浏览器控制大多数套接字设置以防止各种攻击地方。这可能是其中之一 - 查看 websocket 规范和其他描述它的文档,看看 websocket 设置developer.mozilla.org/en-US/docs/Web/API/WebSocket 上什至有哪些选项可用。另一方面,在您拥有更多控制权的服务器端更改此设置或其他设置是否足够?
  • 您好,感谢您的回答!几天前我刚刚看到了 Mozilla 网站。显然,是的,我可以很容易地在服务器端禁用 nagle 算法(例如:WebSocketServer server = new Server(new InetSocketAddress(host, port)); server.setTcpNoDelay(true);) 但它是否需要在客户呢?还是只是 tcp no delay on server side 更受关注?

标签: java html gwt websocket libgdx


【解决方案1】:

我终于找到了一种使它起作用的方法,所以我在这里为感兴趣的人发布一个答案。

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

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

所以总结一下:

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

希望能帮助和我一样遇到同样问题的人!

【讨论】:

    【解决方案2】:

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

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

    在像https://stackoverflow.com/a/13406438/860630 这样的问题中建议的另一个想法是立即响应发送的每条消息,以便网络堆栈尽快刷新所有剩余的消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2013-09-04
      • 2017-12-20
      • 2023-04-04
      • 2013-12-22
      相关资源
      最近更新 更多