如何在Spring Integration中实现TCP流读取器?

5
我希望您能提供一个Spring Integration实现的流读取器。另一个应用程序(不是Java)将数据流(由美元符号分隔)发送到端口9999。此服务器监听

首先,我通过使用telnet 127.0.0.1 9999连接到它来确保流正在流动。

然后,我创建了一个简单的Java应用程序,并使用以下方法。目前这个方法可以工作。

public void readStream() throws IOException{
    Scanner s = null;
    try {
        Socket skt = new Socket("localhost", 9999);
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(
                        skt.getInputStream()));
        s = new Scanner(bufferedReader);
        s.useDelimiter("[$]");
        System.out.println(s);
        while (s.hasNext()) {
            System.out.println("----------------------");
            System.out.println(s.next());
        }
    } finally {
        if (s != null) {
            s.close();
        }
    }
}

现在,我想在Spring Integration框架中实现这个功能。我查看了https://github.com/spring-projects/spring-integration-samples/tree/master/basic/tcp-client-serverhttp://docs.spring.io/autorepo/docs/spring-integration/2.0.0.M3/spring-integration-reference/html/stream.html。但是我不知道从哪里开始?连接到发送应用程序需要什么?(我真的很新于Spring Framework。)
对我来说困难在于术语。我应该创建TCP入站网关吗?还是接收通道适配器?或者因为我正在请求流,所以是出站??
在Gary的评论后编辑
<bean class="org.springframework.integration.ip.tcp.serializer.ByteArraySingleTerminatorSerializer" id="deserializer1">
    <constructor-arg type="byte" value="$"/>
</bean>
<int-ip:tcp-connection-factory id="server" type="server" port="9999"
    deserializer="deserializer1"
/>
<int-ip:tcp-inbound-channel-adapter id="adapter" connection-factory="server" request-channel="channel1"/>
<int:channel id="channel1" />
1个回答

4
一个入站网关是用于服务器对入站请求进行回复时的。入站通道适配器 (<int-ip:tcp-inbound-channel-adapter) 仅用于单向集成 - 客户端只发送数据,而不接收回复。
您需要一个服务器连接工厂,配置使用一个配置有您的$分隔符的ByteArraySingleTerminatorSerializer的,在deserializer属性中。
请使用最新文档而不是您问题中旧版本的文档。

“服务器”是指我的应用程序,还是发送数据流的“其他”应用程序? - codesmith
服务器就是你的应用程序。 - Gary Russell
谢谢Gary,我添加了一些代码;这是你想要的吗? - codesmith
也许我对套接字的理解不够充分。在我的理解中,服务器和客户端在一个单一的端口号上(9999)相遇。流数据的外部应用程序配置为在9999上提供服务。客户端(我的Java应用程序)被配置为侦听9999。在你看来,我的问题哪个部分是不正确的?您是否同意类型也应该为客户端 - codesmith
1
所以,是的,你的术语不正确,__服务器监听__9999端口,__客户端连接__到9999端口(而不是监听)。对于客户端仅连接并接收数据来说这很不寻常,但这是可能的。要使用Spring Integration实现这一点,您需要一个__客户端__连接工厂和在适配器上设置__client-mode="true"__(通常,入站适配器使用服务器工厂,并侦听来自客户端的传入连接)。 - Gary Russell
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接