這是客戶端服務器模式。服務器使用多線程來處理客戶端請求,如果新客戶端請求特定服務器,服務器將初始化一個新線程來處理它。但是,我需要向服務器線程添加一個邏輯流程,以便可能還需要將請求初始化爲另一臺服務器。基本上,服務器本身同時表現爲服務器和客戶端。例如,如果客戶端向服務器發送搜索請求,並且服務器在其本地文件中找不到它,那麼它可以請求另一臺服務器獲取結果並返回給客戶端,這對搜索很有用。 。套接字:服務器線程向另一個服務器初始化一個新請求
我嘗試實現這個由服務器線程的run方法添加請求方法,如:
// server thread handle request for client
public void run(){
try{
// input output stream with client
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader(new InputStreamReader(clnt.getInputStream()));
...
// try to initial a new request to anther server which is already listening
reqstAntherServ();
...
}
}
的reqstAntherServ方法:
public void reqstAntherServ(){
try{
// initial a new socket request
Socket reqstAnthrServ = new Socket(hostname, port);
// input output stream with anther server
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader(new InputStreamReader(clnt.getInputStream()));
...
}
}
然而,在運行的時候,我發現reqstAntherServ方法似乎沒有成功初始化請求,我的意思是例如服務器A要通過方法請求服務器B,結果是已經在監聽的服務器B沒有聽到任何請求。通常,它應該向控制檯輸出一條消息,指示套接字已經創建。
然後我認爲這可能是線程的事情,我猜服務器線程不能同時與客戶端保持通信並初始化一個新的請求。所以我嘗試將reqstAntherServ方法放入另一個新的線程中。基本上,如果服務器想要向另一臺服務器發送請求,則需要創建一個用於處理該請求的新線程。但是,它也不起作用。
我不知道是什麼問題或者有另一種方法來實現這種機制?謝謝!
已更新!包括最初的一個新的線程來把reqstAnerthServ方法,我試過是使用靜態類作爲線程處理器,並把reqstAnotherServ方法的內容轉換成run方法,如:然後在服務器線程
private static class ThreadRqstAntherServ implements Runnable {
...
public void run() {
try{
// initial a new socket request
Socket reqstAnthrServ = new Socket(hostname, port);
// input output stream with anther server
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader(new InputStreamReader(clnt.getInputStream()));
...
}
}
}
對於客戶端處理請求,而不是呼叫的reqstAntherServ方法直接,我使用上述ThreadRqstAntherServ,作爲初始一個新的線程:
// server thread handle request for client
public void run(){
try{
// input output stream with client
PrintWriter out = new PrintWriter(clnt.getOutputStream(), true);
BufferReader in = new BufferReader(new InputStreamReader(clnt.getInputStream()));
...
// try to initial a new request to anther server which is already listening
Runnable r = new ThreadRqstAntherServ(...);
Thread t = new Thread(r);
t.start();
...
}
}
另外包括所述創建服務器進程的代碼,在主功能:
public static void main(String[] args) throws IOException{
try{
ServerSocket serv = new ServerSocket(port);
while (true) {
Socket clnt = serv.accept();
Runnable rServ = new Threadhandler(clnt, ...); // thread handler for the server thread
Thread tServ = new Thread(rServ);
tServ.start();
...
}
}
}
可以包含啓動新線程的代碼嗎? – SimonC
@SimonC更新了代碼,謝謝! – mchen
您是否可以包含接受新連接並啓動線程的服務器代碼? – SimonC