1

サーバーは Java を使用し、TCP 経由で C++ クライアントと通信します。ユーザーが 5 分以上コンピュータを離れると、クライアントはバイト配列をサーバーに送信します。java サーバーは spring-integration-ip によって記述されています。using-nio="true" を設定する必要があるかどうか混乱していますか?同時実行性について?カスタム プロトコルを使用してバイト配列を変換する方法?TCP とスプリング統合は初めてです。ご協力ありがとうございます!

サンプルに従ってアプリを作成すると、問題が発生します。サーバーはバイト ストリームを逆シリアル化し、サービスをエコーし​​ますが、エコー サービスが返された後、クライアントはシリアル化されたバイト ストリームを受信できません。

春-tcp.xml:

<int-ip:tcp-connection-factory 
     id="serverConnectionFactory"
     type="server" port="5678" 
     using-nio="true" 
     serializer="connectionSerializeDeserialize"
     deserializer="connectionSerializeDeserialize" />

<bean id="connectionSerializeDeserialize" 
      class="com.snail.tcp.CustomSerializerDeserializer" />

<int-ip:tcp-inbound-gateway id="gatewayCrLf"
    connection-factory="serverConnectionFactory" request-channel="toSA"
    error-channel="errorChannel" />

<int:channel id="toSA" />

<int:service-activator input-channel="toSA"
    ref="echoService" method="test" />
<bean id="echoService" class="com.snail.tcp.EchoService" />

(de)serialize メソッド:

private static final int LENGTH = 2;
private static final int FLAG = 2;


@Override
public String deserialize(InputStream is) throws IOException {
    logger.debug("begin deserialize");
    int length = Integer.valueOf(parseString(is, LENGTH));
    int flag = Integer.valueOf(parseString(is, FLAG));
    String content = parseString(is, length);
    return content;
}

@Override
public void serialize(String s, OutputStream os) throws IOException {
    logger.debug("begin serialize:" + s);
    byte[] content = s.getBytes();
    os.write(content);
    os.flush();
}

エコー サービス:

 public String test(String input) {
    logger.debug("echo service:" + input);
    //some service...
    return "echo:" + input;
}

主な方法:

 public static void main(String[] args) {
    Socket socket = null;
    Writer out = null;
    BufferedReader in=null;
    try {
        socket = new Socket("127.0.0.1", 5678);
        socket.setSoTimeout(10000);
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        out.write("1001HELLOWORLD");
        out.flush();

        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        StringBuffer str = new StringBuffer();
        int c;
        while ((c = in.read()) != -1) {
            str.append((char) c);
        }
        System.out.println(str.toString());
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            out.close();
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

コンソールログ:

[デバッグ] com.snail.tcp.CustomSerializerDeserializer-deserialize(): デシリアライズを開始します

[デバッグ] com.snail.tcp.EchoService-test(): エコー サービス:HELLOWORLD

[デバッグ] com.snail.tcp.CustomSerializerDeserializer-serialize(): シリアライズを開始:echo:HELLOWORLD

しかし、クライアントはデシリアライズされたメッセージ 'HELLOWORLD' を受信できず、代わりに SocketTimeoutException: Read timed out... どこで間違ったのか知りたいです。

4

1 に答える 1

3

フレームワークが並行性を処理します。通常、多数のクライアントをサポートしている場合は、NIO のみが必要です。少数のクライアントの場合、NIO は通常必要ありません。

カスタム (デ) シリアライザーを使用するか、インバウンド エンドポイントの下流にトランスフォーマーを配置できます。

ドキュメントを読み、サンプルを見て、さらに具体的な質問がある場合は戻ってくることをお勧めします。

于 2013-10-31T02:48:52.853 に答える