我是Spring Integration的新手,并尝试过TCP支持。我已经实现了一个非常基本的TCP服务器,它接受连接并只记录来自客户端的消息。这很好用,但我一直在寻找如何获得客户端连接的本地 IP地址(服务器机器有多个IP地址)。似乎MessageHeader
仅包含远程地址。
这是我的配置:
@EnableIntegration
@Configuration
public class SpringConfig {
@Bean
public MessageChannel requestChannel() {
return new DirectChannel();
}
@Bean
public AbstractServerConnectionFactory serverConnectionFactory() {
TcpNetServerConnectionFactory connectionFactory =
new TcpNetServerConnectionFactory(2000);
return connectionFactory;
}
@Bean
public TcpReceivingChannelAdapter tcpReceivingChannelAdapter() {
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
adapter.setOutputChannel(requestChannel());
adapter.setConnectionFactory(serverConnectionFactory());
return adapter;
}
@Bean
public PrintService printService() {
return new PrintService();
}
}
我的PrintService
:
@MessageEndpoint
public class PrintService {
@ServiceActivator(inputChannel = "requestChannel")
public String print(Message<byte[]> message) {
// How can I get the local IP address here?
}
}
基本上,我希望在java.net.Socket.getLocalAddress()
函数中提供print(...)
的结果。也许是这样的:message.getHeaders().get(IpHeaders.LOCAL_IP_ADDRESS)
我还尝试通过继承TcpMessageMapper
并覆盖supplyCustomHeaders(...)
来添加自定义邮件标头,但我无法找到如何访问底层套接字。
答案 0 :(得分:1)
基本上,我想在我的print(...)函数中使用java.net.Socket.getLocalAddress()中的结果。也许是这样的:message.getHeaders()。get(IpHeaders.LOCAL_IP_ADDRESS)
是的,我最好在T getTarget()
上公开TcpConnection
之类的内容,以便从socket
实施中获取对基础TcpMessageMapper.supplyCustomHeaders()
的访问权限...... < / p>
随意提出JIRA问题,我们将尝试从框架角度弄清楚该怎么做。
与此同时,作为一种解决方法:我猜您应该延长TcpNetServerConnectionFactory
并覆盖其initializeConnection(TcpConnectionSupport connection, Socket socket)
以存储connectionId
&lt; - &gt;某些全球地图中的socket
关系。甚至可能在您的自定义TcpMessageMapper
中?在connectionId
中supplyCustomHeaders()
,您就可以为自己的目的恢复特定的socket
。