0

私が持っているのは、クライアントをリッスンするマルチスレッドソケットサーバーです。開いている接続に対して新しいスレッドが作成され、開始されます。クライアントは、Runtime .exec() メソッドを介していくつかのコマンドを実行するようにサーバーに要求できます。受信した新しいコマンドはすべて新しいスレッドによって処理され (PrintWriter がパラメーターとして渡されます)、すべての出力 (std/err) は PrintWriter を使用してソケット経由で送信されます。

問題は、コマンド (つまりデーモン) に時間がかかり、何らかの理由でクライアントが切断されると、出力を取得できなくなることです。別の接続 (別のスレッドにある新しいクライアント セッション) でそのコマンド実行スレッドから出力を取得する方法を見つける必要があります。

コマンドからのすべての出力を System.out に送信し、それ (System.out) を PrintWriter を使用してソケット経由で送信しようとすることができます (これを行う方法がわかりません)。そして、私が成功した場合、接続されているすべてのクライアントにそのような出力をすべて送信する方法があるかもしれません。

しかし、すべての出力をデータベースに保存しています。複数のクライアントが接続されている場合、データベースに複数の入力が含まれることになります。

この問題を解決するにはどうすればよいか、いくつかのアイデアを教えてください。ありがとう

4

2 に答える 2

1

おそらく、呼び出しを非同期にしたいでしょう。不明な期間のタスクを実行することは、同期的に行うべきではありません。

「リアクター」タイプのサーバー (つまり、クライアントごとに 1 つのスレッド = 即死) を使用し、長時間実行されるトランザクションに対してある種のメッセージ パッシング メカニズムを使用することを検討します。この種の作業を行うミドルウェアはたくさんありますが、使用しているプラ​​ットフォームによって異なります。

ところで、リモート マシンでコマンドを実行するためにソケット接続を使用することはセキュリティ上の欠陥ですが、おそらくすでにご存知でしょう。

于 2012-06-08T09:02:36.693 に答える
0

では、接続ごとにセッション ID を使用することを検討しましたか? この ID は、各実行の出力に関連付けられます。そのため、同じユーザーからの後続の呼び出しで同じ出力が取得される可能性があります。一時的に、出力をリポジトリ (DB、メモリ、ファイルなど) に保存できます。

質問が適切に受け取れていない場合は、訂正してください。

于 2012-06-08T08:52:19.473 に答える