- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想将 Vert.x 3.3.2 和 socketJS 与 eventbus 代理一起使用,一劳永逸地忘记 URL,而只是在消息中进行对话,而不创建 REST 接口(interface) - Java 平台上多年来最好的事情!。但是,我的 hello world 无法正常工作。
我的测试如下:在客户端和服务器端的每个连接和断开连接事件上,它都会打印在控制台上。并且,当客户端连接时,客户端会发送一条消息,服务器会对此进行响应,并且服务器也会向每个人发送通知。发生的情况是,只有第一个客户端发送消息并从服务器获得正确的响应。
Java:
public class App extends AbstractVerticle {
public static void main(String[] args) throws InterruptedException {
Vertx.vertx().deployVerticle(MethodHandles.lookup().lookupClass().getName());
}
@Override
public void start() throws IOException {
Router router = Router.router(vertx);
BridgeOptions options = new BridgeOptions();
PermittedOptions address = new PermittedOptions().setAddress("some-address");
options.addInboundPermitted(address);
options.addOutboundPermitted(address);
SockJSHandler sockJSHandler = SockJSHandler.create(vertx).bridge(options, be -> {
if (be.type() == BridgeEventType.REGISTER) {
System.out.println("sockJs: connected");
vertx.eventBus().publish("some-address", "hey all, we have a new subscriber ");
}
be.complete(true);
});
router.route("/sockjs/*").handler(sockJSHandler);
router.route("/web/*").handler(StaticHandler.create("doc/clientSocketJS"));
vertx.createHttpServer().requestHandler(router::accept).listen(8020, listenHandler -> {
if (listenHandler.failed()) {
LOGGER.log(Level.SEVERE, "Startup error", listenHandler.cause());
System.exit(0); // stop on startup error
}
});
vertx.eventBus().consumer("some-address", message -> {
System.out.println("sockJs: received: " + message.body());
message.reply("I received so I reply");
});
}
}
在文件夹doc/clientSocketJS中有一个index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js"></script>
<script src="js/vertx-eventbus.js"></script>
<script>
var eb = new EventBus('http://localhost:8020/sockjs');
eb.onopen = function() {
console.log('connected');
eb.registerHandler('some-address', function(error, message) {
console.log('received: ' + JSON.stringify(message));
});
eb.send('some-address', {
name : 'from ' + navigator.product
}, null, function(a, message) {
if (message == null) {
console.log("ERROR: response null");
} else {
console.log('response: ', message.body);
}
});
}
eb.onclose = function() {
console.log("disconnected");
eb = null;
};
</script>
</head>
</html>
回复如下:
第一个浏览器客户端已加载:服务器:
sockJs: connected
sockJs: received: hey all, we have a new subscriber
sockJs: received: {"name":"from Gecko"}
客户 1:
connected
response: I received so I reply
这符合预期。然后我加载第二个客户端(相同或其他浏览器):
服务器
sockJs: connected
sockJs: received: hey all, we have a new subscriber
(expecting a 'name' just like first time, but it doesn't appear)
客户端2:
connected
(after a while) ERROR: response null @ index.html::18
出了什么问题?
最佳答案
你的Java代码看起来完全没问题。但 JavaScript 代码看起来像是取自旧示例。
registerHandler 回调的第一个参数是消息本身,而不是错误。
我还使用了托管的 VertxEventBus,而不是提供的,以防万一。
这应该有效:
var eb = new vertx.EventBus('http://localhost:8020/sockjs');
eb.onopen = function() {
console.log('connected');
eb.registerHandler('some-address', function(message) {
console.log('received: ' + JSON.stringify(message));
});
eb.send('some-address', {
name : 'from ' + navigator.product
}, null, function(a, message) {
if (message == null) {
console.log("ERROR: response null");
} else {
console.log('response: ', message.body);
}
});
};
eb.onclose = function() {
console.log("disconnected");
eb = null;
};
<script src="http://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vertx/2.0.0/vertxbus.min.js"></script>
关于通过 Eventbus 的 Java Vert.x 和 SockJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40707856/
目前,我的客户端连接在我刷新页面时打开,在我关闭/刷新选项卡时关闭。 我知道我可以从服务器端关闭连接,但我在文档中找不到从客户端关闭连接的方法。 我希望能够在单击一个按钮时打开一个新连接,并在单击另一
我一直在检查两个类似的解决方案,以使用独立的 Python 服务器通过 sockJS 支持网络套接字,到目前为止,我找到了两个解决方案。 我需要编写一个复杂的、可扩展的基于 web socket 的
我正在尝试从 sockjs-client 库中导入 SockJS。我正在使用 Aurelia 和 typescript ,但在尝试使用 导入时 import { SockJS } from 'sock
我将 https://github.com/mrjoes/sockjs-tornado 用于 Django 应用程序。我可以很容易地从 javascript 控制台发送消息。但我想在 Django 中
我正在关注这个 tutorial此刻,我到了必须在我的 Angular5 组件中实例化我的 SockJS-Client 的地方。 这是我所做的: 我执行以下命令来安装所需的库: npm install
我正在尝试设置一个简单的 html/Js 页面。 我已经安装了 webpack 和 babel。我已经使用“build”和“start”脚本配置了 package.json 文件。 该页面运行良好,但
我正在使用 SocketJS 和 Stomp 通过后端 api 发送文件以进行处理。 我的问题是,如果同时完成两个以上的上传,上传功能就会卡住。 前任: 用户 1 -> 上传文件 -> 后端正确接收文
我想让用户创建并加入“房间”,以便他们可以进行协作。 我正在看SockJs Multiplexer server我想知道我是否可以利用其中的一些来创建并广播到特定的 channel /房间。 在示例中
我正在尝试找出一种方法,让我的 SockJS 客户端在服务器出现故障时重新连接到服务器。 我目前有这个: new_conn = function() { socket =
我正在使用 Vert.x 和 SockJS 来传输封装在消息中的数据。是否有规范 SockJS/Websocket 消息可以有多大? 最佳答案 SockJS 消息的大小没有明确的限制。但不幸的是,So
我正在尝试建立从前端到 vertx 后端的 sock.js 连接。 我最初的尝试是这样的: let token = ''; let data = {'Authorization' : 'Bearer
我正在开发一个 Node.js 后端,它通过 websocket 与一些桌面客户端进行通信,而服务器端的通信是从 Web 前端发起的。一切正常,因为我将 SockJS Connection 实例存储在
我正在开发一个应用程序,它使用 SockJS 来更新连接到服务器的其他应用程序的一些通用数据。问题来了,当我尝试在两个浏览器选项卡中打开它,因为只有其中一个实现了连接,而另一个则一直等待直到超时。 谁
我想通过 Bower 获取最新的 SockJS,并将其保存到我的 bower.json 文件中。 根据GitHub sockjs-client page ,最新版本是 v1.0.3(我看到它的标签)。
有什么方法可以让 Android 与 SockJs 一起在 Phonegap 中打包的应用程序中进行套接字连接?目前我有以下代码可在 iOS 上运行但在 Android 上失败,因为 file:///
使用 node.js 和名为“echo”的 sockjs github 示例 https://github.com/sockjs/sockjs-node ,如果没有任何变化,传输将在大约 130-15
我的应用程序堆栈: 在我的服务器上运行着一个 Redis 服务器。 PHP 后端通过 Redis 服务器与 Predis 库进行通信。它将发布消息。这些消息将由我的 Redis 客户端 (node.j
我有一个网站(Java + Spring)依赖 Websockets(Stomp over Websockets 用于 Spring + RabbitMQ + SockJS)来实现某些功能。 我们正在
我有一个在 localhost:8080 上运行的 SpringBoot 服务器和本地主机上的 npm(服务于 React 应用程序):3000 每当我尝试建立到 spring 的 websocket
正在尝试连接到 SockJs server .我正在从安全的 https 页面 https://localhost/index.php 运行以下代码 var sockjs_url = 'htt
我是一名优秀的程序员,十分优秀!