【发布时间】:2018-06-18 10:12:46
【问题描述】:
这几天我一直在努力使用 websockets 进行基本的客户端/服务器通信
我的客户端是一个带有 libGDX 的 java 客户端,我的服务器是一个基本的 java 服务器
我的主要目标是将我的客户端编译成 HTML5 以使用 websockets 与我的服务器通信。
我在google上搜索时尝试了以下解决方案:
- https://github.com/czyzby/gdx-lml/tree/master/websocket
- https://github.com/pepedeab/libGDX-Net
- https://github.com/TooTallNate/Java-WebSocket
1 似乎是最好的解决方案,但它似乎没有 TCP_NODELAY 套接字设置(在我的情况下这是必不可少的)
2 似乎也是另一个很好的解决方案,但它依赖于http://code.google.com/p/gwt-ws/(此时它不明白这一点)
3 是我选择的,它是一个简单的 WebSocket Java API,让我可以非常轻松地编写客户端和服务器。 它在桌面和 android 上运行得很好,但是当我尝试 html:dist 时,gradle 给我关于 websocket 的错误,它不是继承等...
我的主 build.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