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

时间:2015-11-24 19:50:20

标签: spring spring-integration

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

套接字打开后

服务器需要保持套接字打开,并能够通过打开的套接字从服务器向客户端发送消息

我看一些Spring集成示例,但不确定我看到的示例实际上是对我的requiremnt的引用。

1。弹簧集成tcp是否具有保持打开套接字并从服务器向客户端发送消息的能力?

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

  2. 客户端实现是一个用简单的Tcp java客户端编写的模拟

  3. 谢谢! 尼尔

    这里是上下文配置

    <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 base 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 个答案:

答案 0 :(得分:1)

您可以使用collaborating channel adapters在对等体之间进行完全任意的消息传递。

请参阅TCP Events

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

您可以使用ApplicationListener接收这些活动。

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

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

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

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