まあ、私は春に統合された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();
}
あなたがより多くの質問がある場合は私に知らせてください。
うん!!それはとても明らかです。それを指摘できませんでした。ゲイリーに感謝します。問題のもう一つの部分は、私のクライアントがソケットに書き込まれたデータについて通知され、私のメッセージを処理するためにそこに自分の機能を置くことができるならばです。 –
例として私の編集を参照してください。 –
さて、あなたの編集から、私は 'foo()'にメッセージを受け取りました。しかし、私は、データがソケットに書き込まれると、クライアントに通知する必要があることを期待しています。言い換えれば、私はクライアントに着信データをポーリングするのではなく、データがソケットに書き込まれたときに通知を受け取るようにします。 –