我正在尝试在Spring集成中实现TCP Client。我有一个远程TCP服务器,它将数据泵入套接字。我的基于Spring的TCP客户端必须从该套接字接收数据。
作为客户端,我不是从我这边向服务器发送任何数据,只是连接和接收数据。看看这个http://forum.spring.io/forum/spring-projects/integration/94696-want-to-configure-simple-tcp-client-to-receive-data-from-java-based-tcp-server?view=thread,我明白这是不可能的。但是,收到的答案已经很老了,现在有没有可用的配置?
如果您还有其他问题,请与我们联系。
@updated with configuration
<bean id="javaSerializer" class="org.springframework.core.serializer.DefaultSerializer" />
<bean id="javaDeserializer" class="org.springframework.core.serializer.DefaultDeserializer" />
<context:property-placeholder />
<!-- Client side -->
<int:gateway id="gw"
service-interface="com.my.client.SimpleGateway"
default-request-channel="input" default-reply-channel="replies" />
<int-ip:tcp-connection-factory id="client"
type="client" host="localhost" port="5678"
single-use="false" so-timeout="10000" serializer="javaSerializer"
deserializer="javaDeserializer" so-keep-alive="true"/>
<int:channel id="input" />
<int:channel id="replies">
<int:queue />
</int:channel>
<!-- <int-ip:tcp-outbound-gateway id="outGateway" request-channel="input"
reply-channel="reply" connection-factory="client" request-timeout="10000"
reply-timeout="10000" /> -->
<int-ip:tcp-outbound-channel-adapter
id="outboundClient" channel="input" connection-factory="client" />
<int-ip:tcp-inbound-channel-adapter
id="inboundClient" channel="replies" connection-factory="client"
client-mode="true" retry-interval="10000" auto-startup="true" />
这是我的远程TCP客户端:
final GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.load("classpath:config.xml");
context.registerShutdownHook();
context.refresh();
final SimpleGateway gateway = context.getBean(SimpleGateway.class);
int i=0;
while(i++<10){
String h = gateway.receive();
System.out.println(System.currentTimeMillis()+h);
我的TCP模拟服务器:
while(true) {
try {
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to "
+ server.getRemoteSocketAddress());
DataOutputStream out =
new DataOutputStream(server.getOutputStream());
out.write("ACK\r\n".getBytes());
out.flush();
//server.close();
} catch(SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
} catch(IOException e) {
e.printStackTrace();
break;
}
}
我的网关课程:
public interface SimpleGateway {
public String receive();
}
答案 0 :(得分:1)
TcpReceivingChannelAdapter
(<ip:tcp-inbound-channel-adapter/>
)通常在服务器模式下运行 - 它在套接字上侦听到客户端的传入连接。
但是,为此用例添加了clientMode
(client-mode
)布尔值。它将连接到服务器并从中接收传入数据。如果连接丢失,它将重试连接(在配置计划中)。
通常,入站适配器使用type =&#34; server&#34;连接工厂,侦听传入的连接请求。在某些情况下,需要反向建立连接,从而入站适配器连接到外部服务器,然后等待该连接上的入站消息。
在入站适配器上使用
client-mode="true"
支持此拓扑。在这种情况下,连接工厂必须是client
类型,且必须将single-use
设置为false。另外两个属性用于支持此机制:
retry-interval
指定框架在连接失败后尝试重新连接的频率(以毫秒为单位)。scheduler
用于提供用于安排连接尝试的TaskScheduler,并测试连接是否仍处于活动状态。
如果未提供调度程序,则使用默认的taskScheduler
bean。