Tengo un servidor web propio en mi aplicación. Este servidor web genera un nuevo hilo para cada solicitud que entra en el socket para ser aceptado. Quiero que el servidor web espere hasta que se toque un punto específico en el hilo que acaba de crear.Sincronización en subprocesos para Java
He pasado por muchas publicaciones en este sitio y ejemplos en la web, pero no puedo hacer que el servidor web proceda después de que le digo al hilo que espere. Un ejemplo de código básico sería genial.
¿Es la palabra clave sincronizada la forma correcta de hacerlo? Si es así, ¿cómo se puede lograr esto? Los ejemplos de código están por debajo de mi aplicación:
servidor 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);
}
}
código de rosca
public void run() {
//code here
//notify web server to continue here
}
Actualización - código final es la siguiente. El HttpRequest
se limita a llamar resumeListener.resume()
cada vez que envío un encabezado de respuesta (por supuesto, también la adición de la interfaz como una clase separada y el método addResumeListener(ResumeListener r1)
en HttpRequest
):
porción Servidor 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);
}
}
Así como una cuestión académica, ¿Por qué escribió su propio código de servidor web? – MattC
La aplicación muestra contenido encriptado, así que básicamente al crear mi propio servidor web interno, puedo realizar la autenticación. Si un navegador externo intenta usar el mismo socket al que estoy transfiriendo los datos, no tendría las credenciales adecuadas que yo proporciono internamente si la solicitud proviene de mi aplicación. – Ken
No veo cómo eso imposibilita el uso de un servidor web diferente: casi todos los servidores web admiten la autenticación basada en IP, entre otros mecanismos. – bdonlan