2012-07-15 147 views
2

我一直在瀏覽HTTP文件服務器和上傳服務器上的示例。Netty文件服務器

我正在寫一個文件服務器,可以做到這一點:發送和接收文件。但我不確定如何合併這兩條管道。 或者我可能需要根據命令修改它們(上傳或獲取文件)。即使文檔聲明一次建立的通道不能修改管道,我也會看到「端口統一」示例會根據數據進行修改。

任何幫助將不勝感激。

+2

shg;我認爲你誤解了文檔。您可以隨時更換管線。管道也是線程安全的 – Nicholas 2012-07-15 14:17:18

+0

如此處所述:[鏈接](http://static.netty.io/3.5/api/org/jboss/netty/channel/ChannelPipeline.html)對於每個新通道,必須有一條新管道創建並附加到頻道。一旦連接,通道和管道之間的耦合是永久的;該通道不能附加其他管道,也不能將當前管道與其分離。 – betaman 2012-07-16 00:41:22

+0

我想可以在管道中添加或刪除處理程序。謝謝你的評論。 – betaman 2012-07-16 00:48:16

回答

1

我認爲您需要將您的應用程序視爲2個子應用程序中的一個。

第一個子應用程序是文件服務器。您將需要引導併爲此創建管道,如Http file server example

第二個子應用程序是上傳客戶端。您將需要單獨引導,並根據http client example創建管道。

+0

如果我理解正確,你建議創建一個普通的服務器和上傳服務器,以及他們相應的客戶端? 他們也應該去2個不同的端口。 沒有辦法創建可同時發送和接收文件的HTTP文件服務器嗎?即使這意味着一些動態管道處理? – betaman 2012-07-16 00:33:54

+1

Http服務器只響應請求。如果你想通過http post發起一個文件(正如我從你的問題中所理解的那樣),我的理解是你需要實現一個http客戶端。 – Veebs 2012-07-16 12:56:35

+0

謝謝。是的,事實上,我不打算使用瀏覽器,它將是一個p2p應用程序。我想知道我是否需要2個不同的客戶端,一個用於上傳,一個用於下載,或者一個用於下載。 – betaman 2012-07-17 06:38:23

2

這聽起來像你需要一個HTTP服務器,並區分HTTP GET下載文件到客戶端和POST上傳文件到服務器,而不是區分類型與管道。請查看HttpStaticFileServerHandler下載帶有GET請求的文件。你需要改編的是messageReceived的第一行:

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
    HttpRequest request = (HttpRequest) e.getMessage(); 

    if (request.getMethod().equals(HttpMethod.POST)) { 
     // receive uploaded file 
     return; 
    } 

    if (request.getMethod() != GET) { 
     sendError(ctx, METHOD_NOT_ALLOWED); 
     return; 
    } 

    ... 
+0

謝謝。是的,我想我需要在messageReceived中區分當前的請求,但由於發送和上傳的管道不同(在示例中),我不太確定它們是否兼容。我會試驗看看。 – betaman 2012-07-17 06:36:16