2016-05-17 9 views
0

まあ、私は春に統合されたTCPクライアントを持っています。私はリモートTCPサーバに接続しようとしていて、サーバから非同期に書き込まれたソケットからデータを受信しようとしています。Spring統合TCPクライアント - 複数のメッセージを受信して​​いないクライアント。 onMessageイベントを処理する必要があります

しかし、私のクライアントは最初のメッセージを受信して​​おり、それ以上のメッセージをサーバーソケットから受け取っていません。(実際にサーバーログを見れば、クライアントは接続が失われていますが、理由は?)

もう1つは、メッセージを受信した瞬間に特定の機能をどのように起動させることができるのでしょうか? - TcpConnectionHandler-handleMessage()またはTcpLisetner - onMessage()です。

最終的に、私は、リモートサーバに接続してデータを受信するSpring TCPクライアントを持っていたいと思います。以下は私の構成やコードです:

私の設定:

<bean id="javaSerializer" class="com.my.client.CustomSerializerDeserializer" /> 
<bean id="javaDeserializer" class="com.my.client.CustomSerializerDeserializer" /> 

<context:property-placeholder /> 

<!-- Client side --> 

<int:gateway id="gw" service-interface="com.zebra.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="100000" serializer="javaSerializer" deserializer="javaDeserializer" 
    so-keep-alive="true" /> 

<int:channel id="input" /> 

<int:channel id="replies"> 
    <int:queue /> 
</int:channel> 
<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" auto-startup="true" /> 

マイ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; 
    } 
    } 

Serverログ:ポート5678上でクライアントを待機

... だけ/127.0.0.1:56108に接続 ポート5678でクライアントを待っています...

マイれるtcpClient:

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("Received message "+h); 

    }try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

私のクライアントログ:

受信したメッセージACK

受信したメッセージ 受信したメッセージ 受信したメッセージ 受信したメッセージ 受信したメッセージ 受信したメッセージ 受信したメッセージ 受信したメッセージ メッセージを受け取った

マイカスタムデシリアライザ:

@Override 
public String deserialize(InputStream inputStream) throws IOException { 
    // TODO Auto-generated method stub 
    StringBuilder builder = new StringBuilder(); 


    int size = inputStream.available(); 

    int c; 
    for (int i = 0; i < size; ++i) { 
     c = inputStream.read(); 

     if(c!=-1){ 
     builder.append((char)c); 
     } 
     else{ 
      break; 
     } 
    } 


    return builder.toString(); 
} 

私のゲートウェイ:

public interface SimpleGateway { 

    public String receive(); 

} 

あなたがより多くの質問がある場合は私に知らせてください。

答えて

1

サーバーは1つのメッセージのみを送信し、新しい接続を受け入れます。

EDIT

は、私がメッセージを受け取る瞬間、特定の機能をトリガ?

あなたは現在、inputチャネルをアウトバウンドチャネルアダプタに接続しています。このチャネルアダプタは、単にそれを再び書き戻すだけです。あなたはこのような何かを行うことができ

...

<int:object-to-string-transformer input-channel="input" output-channel="next" /> 

<int:service-activator input-channel="next" method="foo"> 
    <bean class='foo.Foo" /> 
</int:service-activator> 

public class Foo { 

    public void foo(String payload) { 
     ... 
    } 

} 

あなたはbyte[]に対処したい場合は、変圧器を省略しfoo(byte[] bytes)を使用することができます。

+0

うん!!それはとても明らかです。それを指摘できませんでした。ゲイリーに感謝します。問題のもう一つの部分は、私のクライアントがソケットに書き込まれたデータについて通知され、私のメッセージを処理するためにそこに自分の機能を置くことができるならばです。 –

+0

例として私の編集を参照してください。 –

+0

さて、あなたの編集から、私は 'foo()'にメッセージを受け取りました。しかし、私は、データがソケットに書き込まれると、クライアントに通知する必要があることを期待しています。言い換えれば、私はクライアントに着信データをポーリングするのではなく、データがソケットに書き込まれたときに通知を受け取るようにします。 –

関連する問題