Spring Integration TCP:如何获取本地IP地址

时间:2016-02-09 19:10:36

标签: spring-integration

我是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?
    }
}

编辑1

基本上,我希望在java.net.Socket.getLocalAddress()函数中提供print(...)的结果。也许是这样的:message.getHeaders().get(IpHeaders.LOCAL_IP_ADDRESS)

我还尝试通过继承TcpMessageMapper并覆盖supplyCustomHeaders(...)来添加自定义邮件标头,但我无法找到如何访问底层套接字。

1 个答案:

答案 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中?在connectionIdsupplyCustomHeaders(),您就可以为自己的目的恢复特定的socket