के लिए धागे में सिंक्रनाइज़ेशन मेरे पास मेरे ऐप में एक घर उगाया गया वेब सर्वर है। यह वेब सर्वर स्वीकार्य होने के लिए सॉकेट में आने वाले प्रत्येक अनुरोध के लिए एक नया धागा बनाता है। मैं चाहता हूं कि वेब सर्वर तब तक इंतजार करे जब तक कि उस थ्रेड में एक विशिष्ट बिंदु हिट न हो जाए।जावा
मैं इस साइट पर कई पोस्ट और वेब पर उदाहरणों के माध्यम से रहा हूं, लेकिन थ्रेड को प्रतीक्षा करने के बाद वेब सर्वर आगे बढ़ने के लिए नहीं मिल सकता। एक बुनियादी कोड उदाहरण बहुत अच्छा होगा।
क्या सिंक्रनाइज़ किए गए कीवर्ड को इसके बारे में जाने का सही तरीका है? यदि हां, तो यह कैसे प्राप्त किया जा सकता है? कोड उदाहरण मेरे ऐप्लिकेशन के नीचे हैं:
वेब सर्वर
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
सिर्फ resumeListener.resume()
फोन करता है जब भी मैं एक प्रतिक्रिया हेडर भेज (बेशक एक अलग वर्ग के रूप में इंटरफेस और HttpRequest
में addResumeListener(ResumeListener r1)
विधि जोड़ने):
वेब सर्वर भाग
// 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
ऐप एन्क्रिप्टेड सामग्री प्रदर्शित करता है, इसलिए मूल रूप से अपना स्वयं का आंतरिक वेब सर्वर बनाकर, मैं प्रमाणीकरण कर सकता हूं। यदि कोई बाहरी ब्राउज़र उसी सॉकेट का उपयोग करने का प्रयास करता है, तो मैं डेटा पास कर रहा हूं, तो मेरे पास ऐप से अनुरोध होने पर आंतरिक रूप से आपूर्ति करने वाले उचित प्रमाण-पत्र नहीं होंगे। – Ken
मुझे नहीं लगता कि यह एक अलग वेबसर्वर का उपयोग करने से कैसे रोकता है - लगभग हर वेब सर्वर अन्य तंत्रों के बीच आईपी-आधारित प्रमाणीकरण का समर्थन करता है। – bdonlan