私のアプリに自宅のWebサーバーがあります。このWebサーバーは、ソケットに入ってくるすべての要求に対して新しいスレッドを生成します。私は、Webサーバが、作成したばかりのスレッドで特定のポイントに達するまで待つ必要があります。Java用スレッドの同期
私は、このサイトとWeb上の例で多くの記事を読んできましたが、スレッドに待つように指示してからWebサーバーを起動できません。基本的なコード例は素晴らしいでしょう。
synchronizedキーワードはこれについて正しい方法ですか?もしそうなら、これはどのように達成できますか?コード例は、私のアプリの下にある:
Webサーバー
while (true) {
//block here until a connection request is made
socket = server_socket.accept();
try {
//create a new HTTPRequest object for every file request
HttpRequest request = new HttpRequest(socket, this);
//create a new thread for each request
Thread thread = new Thread(request);
//run the thread and have it return after complete
thread.run();
///////////////////////////////
wait here until notifed to proceed
///////////////////////////////
} catch (Exception e) {
e.printStackTrace(logFile);
}
}
スレッドコード
public void run() {
//code here
//notify web server to continue here
}
アップデート - 最終的なコードは以下の通りです。私はレスポンスヘッダを送信するたびHttpRequest
だけで(もちろん、別のクラスとしてインターフェイスとHttpRequest
でaddResumeListener(ResumeListener r1)
メソッドを追加)resumeListener.resume()
を呼び出しん:
Webサーバーの部分を使用でき
// server infinite loop
while (true) {
//block here until a connection request is made
socket = server_socket.accept();
try {
final Object locker = new Object();
//create a new HTTPRequest object for every file request
HttpRequest request = new HttpRequest(socket, this);
request.addResumeListener(new ResumeListener() {
public void resume() {
//get control of the lock and release the server
synchronized(locker) {
locker.notify();
}
}
});
synchronized(locker) {
//create a new thread for each request
Thread thread = new Thread(request);
//run the thread and have it return after complete
thread.start();
//tell this thread to wait until HttpRequest releases
//the server
locker.wait();
}
} catch (Exception e) {
e.printStackTrace(Session.logFile);
}
}
ちょうど学術疑問として、なぜあなたはあなた自身のウェブサーバーのコードを書くのですか? – MattC
アプリは暗号化されたコンテンツを表示するので、基本的に自分の内部Webサーバーを作成して認証を実行できます。外部のブラウザがデータを通過させている同じソケットを使用しようとすると、要求が私のアプリケーションから来た場合、内部的に提供する適切な資格情報を持っていないでしょう。 – Ken
これは、他のWebサーバーを使用することをどのように妨げているのかわかりません。ほとんどのWebサーバーは、IPベースの認証をサポートしています。 – bdonlan