2016-02-09 44 views
2

我是Spring Integration的新手,並嘗試使用TCP支持。我已經實現了一個非常基本的TCP服務器,它接受連接並只記錄來自客戶端的消息。這工作正常,但我堅持找出如何獲得客戶端連接的IP地址(服務器計算機有多個IP地址)的本地。看起來MessageHeader只包含遠程地址地址。Spring Integration TCP:如何獲得本地IP地址

這裏是我的配置:

@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

@ArtemBilan請參閱上面的編輯1。 – user2286693

+1

請看我的答案。 –

回答

1

基本上,我想從java.net.Socket.getLocalAddress()在我的打印(...)函數中可用的結果。也許是這樣的:message.getHeaders()得到(IpHeaders.LOCAL_IP_ADDRESS)

呀,我最好的TcpConnection暴露類似T getTarget()允許獲得從TcpMessageMapper.supplyCustomHeaders()實現基本socket訪問...

隨時就此問題提出JIRA,我們將嘗試從框架的角度弄清楚要做什麼。

同時,作爲一種解決辦法:我想你應該擴展TcpNetServerConnectionFactory位並覆蓋其initializeConnection(TcpConnectionSupport connection, Socket socket)存儲connectionId < - 在一些世界地圖>socket關係。甚至可能在您的自定義TcpMessageMapper?在supplyCustomHeaders()中有connectionId,您將能夠爲您的目的恢復特定的socket

+0

謝謝。我創建了[INT-3952](https://jira.spring.io/browse/INT-3952)。關於您的解決方法:當連接關閉時,從全局地圖中刪除'connectionId'套接字關係的適當位置是什麼? – user2286693

+1

如何從您的自定義'supplyCustomHeaders()'完全做到這一點?你甚至可以把這個'socket'放到頭文件中。我同意從框架的角度來看是很危險的,但我想這對你的應用程序應該沒問題。 –

+0

我試過了,但似乎沒有調用'supplyCustomHeaders()'的情況,例如當客戶端發送不完整的消息時。然後,此連接的條目永遠不會從全局地圖中刪除。 – user2286693