Tôi có một máy chủ web được phát triển trong ứng dụng của mình. Máy chủ web này sinh ra một chuỗi mới cho mọi yêu cầu đi vào ổ cắm để được chấp nhận. Tôi muốn máy chủ web đợi cho đến khi một điểm cụ thể được nhấn vào chuỗi mà nó vừa tạo.Đồng bộ hóa trong chủ đề cho Java
Tôi đã trải qua nhiều bài đăng trên trang web này và các ví dụ trên web, nhưng không thể yêu cầu máy chủ web tiếp tục sau khi tôi yêu cầu chuỗi chờ. Một ví dụ mã cơ bản sẽ là tuyệt vời.
Từ khóa được đồng bộ hóa có đúng cách để thực hiện việc này không? Nếu vậy, làm thế nào điều này có thể đạt được? Mã số ví dụ dưới của ứng dụng của tôi:
Web Server
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);
}
}
Chủ đề đang
public void run() {
//code here
//notify web server to continue here
}
Update - Mã cuối cùng là như dưới đây. Các HttpRequest
không chỉ cần gọi resumeListener.resume()
bất cứ khi nào tôi gửi một đáp ứng tiêu đề (tất nhiên cũng có thêm giao diện như là một lớp riêng biệt và addResumeListener(ResumeListener r1)
phương pháp trong HttpRequest
):
phần Web Server
// 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);
}
}
Cũng giống như một câu hỏi học tập, tại sao bạn viết mã máy chủ web của riêng bạn? – MattC
Ứng dụng hiển thị nội dung được mã hóa, vì vậy về cơ bản bằng cách tạo máy chủ web nội bộ của riêng tôi, tôi có thể thực hiện xác thực. Nếu một trình duyệt bên ngoài cố gắng sử dụng cùng một socket tôi đang truyền dữ liệu qua, nó sẽ không có thông tin đăng nhập phù hợp mà tôi cung cấp nội bộ nếu yêu cầu đến từ ứng dụng của tôi. – Ken
Tôi không thấy cách ngăn cản việc sử dụng máy chủ web khác - hầu như mọi máy chủ web đều hỗ trợ xác thực dựa trên IP, trong số các cơ chế khác. – bdonlan