2013-10-21 31 views
-2

這是客戶端服務器模式。服務器使用多線程來處理客戶端請求,如果新客戶端請求特定服務器,服務器將初始化一個新線程來處理它。但是,我需要向服務器線程添加一個邏輯流程,以便可能還需要將請求初始化爲另一臺服務器。基本上,服務器本身同時表現爲服務器和客戶端。例如,如果客戶端向服務器發送搜索請求,並且服務器在其本地文件中找不到它,那麼它可以請求另一臺服務器獲取結果並返回給客戶端,這對搜索很有用。 。套接字:服務器線程向另一個服務器初始化一個新請求

我嘗試實現這個由服務器線程的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(); 
     ... 
    } 
    } 
} 
+0

可以包含啓動新線程的代碼嗎? – SimonC

+0

@SimonC更新了代碼,謝謝! – mchen

+0

您是否可以包含接受新連接並啓動線程的服務器代碼? – SimonC

回答

-2

問題解決的原因是由於服務器套接字同時在兩個端口上偵聽,所以需要使用額外的線程來處理第二個端口,否則通信將被阻塞。

+0

同樣無法理解。 ServerSocket不會在兩個端口上偵聽。 – EJP

相關問題