当前位置: 首页 > 知识库问答 >
问题:

Spring集成TCP服务器推送到客户端

莫骞仕
2023-03-14

我需要实现一个TCP服务器,它基本上应该在与客户端握手时打开一个套接字。

套接字打开后服务器需要保持套接字打开,并且能够通过打开的套接字将消息从服务器推送到客户端

我查看了一些spring集成示例,但不确定我所看到的示例是否确实参考了我的需求。

1. Spring集成tcp是否有这种能力来保持打开套接字并将消息从服务器发送到客户端?

服务器还应支持传入请求

客户端实现是作为简单Tcp java客户端编写的模拟

谢谢!尼尔

此处上下文配置

<int-ip:tcp-connection-factory id="server"
                               type="server"
                               port="5679"
                               host="localhost"
                               single-use="false"
                               deserializer="javaDeserializer"
                               serializer="javaSerializer" />



<int-ip:tcp-inbound-channel-adapter id="inboundServer"
                                    channel="inloop"
                                    connection-factory="server" client-mode="false"/>

<int-ip:tcp-outbound-channel-adapter id="outboundServer"
                                     channel="outloop"
                                     connection-factory="server" client-mode="false"/>


<channel id="inloop"/>
<channel id="outloop"/>

在我使用的服务器端

outputchanel.send(new GenericMessage<String>("HI World from server16\n",header));

并在客户端读取推送消息

 BufferedReader stdIn = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));
    while ((serverResponse = stdIn.readLine()) != null) {
      _logger.info("RESPONSE FROM SERVER::"+serverResponse);
    }

客户端是一个基于java的tcp客户端,未配置spring集成,这是一个用于将来集成的模拟客户端

为了支持echo服务器对字节数组不以“\n”终止的请求,我扩展了AbstractByteArraySerializer,并重写了反序列化

 public byte[] deserialize(InputStream inputStream) throws IOException {
    _Logger.trace("start deserialize");
    byte[] result;
    try {
        byte[] buffer = new byte[getMaxMessageSize()];
        int numOfBytes = inputStream.read(buffer, 0, buffer.length);

        result = copyToSizedArray(buffer, numOfBytes);
    } catch (IOException e) {
        _Logger.error("Exception on deserialize tcp inbound stream ", e);
        //publishEvent(e, , n);
        throw e;
    }
    return result;

}

共有1个答案

孙经艺
2023-03-14

您可以使用协作通道适配器在对等方之间进行完全任意的消息传递。

请参阅TCP事件。

当客户端连接时,tcp入站通道适配器(实际上是连接工厂)将发布TcpConnectionOpenEvent。

您可以使用Application ationListener来接收这些事件。

事件包含连接ID。然后,您可以开始向tcp出站通道适配器发送消息,消息头中名为ip\U connectionId(IpHeaders.CONNECTION\U ID)。

入站适配器从客户端接收的入站消息(如果有)在标头中具有相同的值。

只需配置服务器连接工厂并配置两个适配器即可使用它。

如果服务器必须打开套接字,请使用client-mode="true"并注入客户端连接工厂。

 类似资料:
  • 客户端关于推送的方法只有两个,它们分别是: Subscribe 方法 Subscribe(name string, id string, settings *InvokeSettings, callback interface{}) (err error) Subscribe 方法的用处是订阅服务器端的推送服务。该方法有两种方式,一种是自动获取设置客户端 id,另一种是手动设置客户端 id。 参数

  • 可能是一个简单的方法, 我想要的是:我有一个监听传入连接的tcp服务器。当客户连接时,我希望以某种方式得到通知。TcpNetServerConnectionFactory内部有这样的信息"接受的连接..."。 有一个TcpConnectionSupport类,但是我找不到如何使用它的方法。我正在寻找类似的用户模式。 有什么办法可以做到吗?

  • 创建 TCP 服务器 使用最简单的方法来创建一个 TCP 服务器,使用所有默认选项如下所示: NetServer server = vertx.createNetServer(); 配置 TCP 服务器 如果你不想默认值,可以将服务器配置通过传入一个NetServerOptions实例来创建它: NetServerOptions options = new NetServerOptions().s

  • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s