0

私はクライアントサーバーアプリケーションを持っています - C++のクライアント(ライブラリを使用してAIXで実行)とJavaのサーバー(Java.net. java.io.を使用してWinおよびAIXで実行)。アプリケーションの構造は次の
サーバーです

//...
while (true)
         {
            final Socket s = ss.accept();
            pool.execute(new Service(s));
         }
// ..

Service.classは、入力ストリームからバイトを取得し、バイトを otputstream に送信します。そしてソケットを閉じます

クレイント

SendMessage(msg)
{ 
// ...
   const int socketFD = OpenSocket();
// send bytes
// receive bytes
    close(socketFD);
}  

質問は次のとおりです。クライアント側でソケットを開き、メッセージを送信し、メッセージを受信し、しばらくしてから新しいメッセージを送信し、新しいメッセージを受信できますか。ソケットを再オープンせずに?

4

2 に答える 2

2

できますよ。ただし、サーバーは複数のメッセージが予想されることを理解する必要があり、クライアントが接続を閉じるまでサービスを強制終了しないでください。実装の問題は、 Service が Runnable であり、 Thread ではないことです。メッセージの受信時にループする場合は、実行中のスレッドを保持します。FixedThreadPool を使用すると、すべてのプール スレッドが使い果たされ、前のクライアントのいずれかが切断されるまで次のサービスが待機する状況が発生する可能性があります。CachedThreadPool を使用するとこれを回避できますが、その結果、使用されるスレッドの数はクライアントの数と同じになります。十分なメイン メモリがあれば、これは問題になりません (各スレッドは約 0.5 Mb を使用します)。メモリを節約したい場合は、Apache Netty などの非同期ネットワーク ライブラリを使用できます。Java 7 には非同期チャネルが実装されています。

https://github.com/rfqu/df4jは軽量のデータフロー ライブラリであり、Java7 非同期ネットワーク機能を使いやすくするためのラッパーが含まれています。

于 2012-04-13T13:33:09.083 に答える
0

はい、そうです。HTTP とは別に、ほとんどのプロトコルは永続的な接続を使用します (SMTP、POP3、FTP、ICQ など)。

于 2012-04-13T13:18:59.337 に答える