1

我正在ClientConnector使用NetClientand编写课程JsonParser

以下是我进入的步骤:

  1. 使用连接到服务器NetClient
  2. 用于Pump处理背压
  3. 用于io.vertx.core.parsetools.JsonParser解析完整的JSON响应对象
  4. 在套接字上写入 2 个请求

问题是我只收到第一个请求的服务器响应。

如何获得后续请求的响应?

下面是AsyncClientConnector类代码:

package com.luckyrhinos.sbg.robots;

import static io.vertx.core.parsetools.JsonEventType.VALUE;
import static org.awaitility.Awaitility.await;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import org.junit.Test;

import com.luckyrhinos.core.common.utils.RefHolder;

import io.vertx.reactivex.core.Vertx;
import io.vertx.reactivex.core.net.NetClient;
import io.vertx.reactivex.core.net.NetSocket;
import io.vertx.reactivex.core.parsetools.JsonParser;
import io.vertx.reactivex.core.streams.Pump;

public class JsonRequestTest {

  @Test
  public void testName() throws Exception {

    Vertx vertx = Vertx.vertx();

    NetClient client = vertx.createNetClient();

    RefHolder<NetSocket> hSocket = new RefHolder<>();

    AtomicBoolean ready = new AtomicBoolean(false);
    client.rxConnect(12344, "localhost") //
        .subscribe(socket -> {
          Pump.pump(socket, socket).start();
          JsonParser parser = JsonParser.newParser().objectValueMode();
          hSocket.obj = socket;

          socket //
              .exceptionHandler(e -> {
                e.printStackTrace();
                client.close();
              }) //
              .endHandler(v -> {
                System.out.println("Done!");
                client.close();
              }) //
              .handler(parser::handle);

          parser.handler(event -> {
            if (event.type() == VALUE) {
              System.out.println(event.value());
            }
          });

          ready.set(true);
        });

    await().atMost(5, TimeUnit.SECONDS).untilTrue(ready);

    ready.set(false);
    hSocket.obj.write("{ \"type\":\"SetupRequest\",\"ply\":2 }");
    hSocket.obj.write("{ \"type\":\"PingRequest\", \"id\":\"123456789\" }");

    await().atMost(5, TimeUnit.SECONDS).untilTrue(ready);
  }
}
4

1 回答 1

0

你有三个问题:

  • Pump.pump(socket, socket).start();不做你认为它做的事。也许尝试删除它。不要“处理背压”。
  • 不要使用RefHolder. 只需在这里使用一个长度为 1 的数组。
  • 打电话给你obj.writevertx.runOnContext您不应该在上下文vertx之外使用对象。vertx或者,检查 Vertx JUnit Test Runner 并查看它是否满足您的需求(这将为您提供TestContext测试参数)。

如果没有您的服务器代码,很难判断您的服务器是否会正确处理没有前缀长度参数的两条消息(即,如果您有正确实现的等价物JsonParser)。

如果您更喜欢消息模型而不是流模型,那么您几乎肯定想要使用 Web 套接字之类的东西。TCP 本身不适合您建议使用它的任务,因为它没有长度前缀之类的东西

于 2018-04-10T08:06:40.190 回答