2014-08-27 134 views
0

我刚开始使用Spring-Integration,并且实现了向服务器发送“OK”消息的TCP服务器。我想记录客户端IP地址和从客户端收到的文本。Spring集成TCP服务器:获取IP地址和负载

我能够通过下面的配置文件成功获取客户端发送的文本,但我不知道如何获取客户端的IP地址。

以下是TCP服务器的配置文件。

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:int="http://www.springframework.org/schema/integration" 
    xmlns:int-ip="http://www.springframework.org/schema/integration/ip" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
    http://www.springframework.org/schema/integration/ip http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd"> 

<context:property-placeholder /> 
<int-ip:tcp-connection-factory id="tcpServer" 
           type="server" 
           using-nio="true" 
           port="${tcpServer.port}"/> 

<int-ip:tcp-inbound-gateway id="tcpGateway" 
          connection-factory="tcpServer" 
          request-channel="bytesChannel" 
          error-channel="errorChannel"/> 


<int:service-activator input-channel="inputChannel" ref="myTcpService" method="processInput"/> 

<bean id="myTcpService" class="MyTcpService" /> 

<int:transformer id="transformerBytes2String" 
       input-channel="bytesChannel" 
       output-channel="inputChannel" 
       expression="new String(payload)"/> 

<int:transformer id="errorHandler" 
       input-channel="errorChannel" 
       expression="payload.failedMessage.payload + ':' + payload.cause.message"/> 

<int:channel id="inputChannel" /> 
<int:channel id="bytesChannel"/> 

</beans> 

MyTcpService类:

public class MyTcpService { 
    public String processInput(String input){ 
     return "OK"; 
    } 
} 

我想知道是否有可能与在“processInput”方法的有效载荷相处的IP地址。

回答

1

几个连接属性都存储在MessageHeadersTcpMessageMapper):

messageBuilder 
     .setHeader(IpHeaders.HOSTNAME, connection.getHostName()) 
     .setHeader(IpHeaders.IP_ADDRESS, connection.getHostAddress()) 
     .setHeader(IpHeaders.REMOTE_PORT, connection.getPort()) 
     .setHeader(IpHeaders.CONNECTION_ID, connectionId); 

因此,你可以简单的添加一个参数传送给processInput方法得到所需的标题值:

public String processInput(String input, @Header(IpHeaders.IP_ADDRESS) String ip){ 

当没有任何注释的input参数仍然映射到​​。

+0

您也可以用'替换'transformerBytes2String'变压器' – 2014-08-27 21:27:04