繁体   English   中英

Spring Integration TCP服务器推送到客户端

[英]Spring integration TCP server push to client

我需要实现一个TCP服务器,该服务器基本上应该打开一个套接字,作为与客户端握手的一部分。

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

我查看了一些Spring集成示例,但不确定所看到的示例是否确实是对我的需求的引用。

1。spring集成tcp是否具有保持打开套接字并将消息从服​​务器发送到客户端的功能?

  1. 服务器应该也支持传入请求

  2. 客户端实现是作为简单的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);
    }

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

为了支持不以'\\ 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;

}

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

请参阅TCP事件

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

您可以使用ApplicationListener接收这些事件。

该事件包含一个connectionId 然后,您可以使用名为ip_connectionIdIpHeaders.CONNECTION_ID )的标头中的connectionId ,开始将消息发送到tcp出站通道适配器。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM