2012-04-13 6 views
0

私は、C++(AIX上で実行中、ライブラリを使用)上のクライアントとJava上のサーバ(Winで、AIXでjava.net。、java.io.)を使用しています。アプリケーションの 構造
次サーバー
clien-serverアプリケーション。いつも開いているソケット

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

あるService.classは、入力streanからバイトを取得し、otputstreamためにバイトを送信します。 して閉じるソケットの

Cleint

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

質問は次である:私は、 送信メッセージは、メッセージをクライアント側で一度開いたソケットを受信して​​、いくつかの時間後に新しいメッセージを指定を送信することができ と新しいメッセージを受け取る。 ソケットを再オープンしないでください。

答えて

2

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

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

0

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

関連する問題