2017-08-14 143 views
1

很容易在任何端口上創建Wt網頁,例如200.59.43.32:3333。使用Wt框架監聽數據

然而,當有人向它發送數據(一些數據字符串,json等)時,是否有一個函數(我找不到)在相同的端口上偵聽。換句話說,如果有人向200.59.43.32:3333發送了一個字符串「大量數據」的數據,我該如何使用Wt來捕獲它?

編輯:如果用純字符串不可能,用適當的JSON可以嗎?

我知道我可以打開另一個端口使用(Linux)的插座/綁定等這樣的字符串來聽..

回答

0

如果你想發送純字符串,你需要打開一個套接字。 HTTP應用程序使用HTTP協議與客戶端進行通信,因此要執行此「Wt-way」,您應該執行HTTP請求,GET或POST。

據我所知,你需要創建一個WResource並在服務器上使用WServer::addResource()註冊它,給它一個固定的URL。之後重新執行WResource::handleRequest()來訪問HTTP請求數據。

0

如果它只是隨機數據,我不知道你可以用Wt來做。在這種情況下,您可以使用HAProxy等反向代理解決方案,並將任何HTTP流量轉發至Wt,並將任何其他流量轉發至其他套接字。

如果你在談論HTTP流量,靜態資源可能就是你所追求的。 Wt對TechEmpower framework benchmarks的實現包含一些自定義靜態資源,您可以將代碼放在上面。例如,有個PlaintextResource

class PlaintextResource : public Wt::WResource { 
    virtual void handleRequest(const Wt::Http::Request &request, Wt::Http::Response &response) { 
    response.setMimeType("text/plain"); 
    response.addHeader("Server", "Wt"); 

    response.out() << "Hello, World!"; 
    } 
}; 

可以使用request變量來檢索請求的任何數據,請參見Wt::Http::Request

您可以作出這樣這個資源訪問:

int main(int argc, char** argv) { 
    try { 
    Wt::WServer server(argv[0]); 

    server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION); 

    PlaintextResource plaintextResource; 
    server.addResource(&plaintextResource, "/plaintext"); 

    if (server.start()) { 
     int sig = Wt::WServer::waitForShutdown(argv[0]); 

     std::cerr << "Shutdown (signal = " << sig << ")" << std::endl; 
     server.stop(); 
    } 
    } catch (Wt::WServer::Exception& e) { 
    std::cerr << e.what() << "\n"; 
    return 1; 
    } catch (std::exception& e) { 
    std::cerr << "exception: " << e.what() << "\n"; 
    return 1; 
    } 
} 
+0

謝謝你,如果該字符串是正確的JSON雖然? – Levi

+0

如果您通過HTTP發送JSON,則可以從'request.in()'中檢索JSON,它將返回一個'std :: istream&'。 然後你可以用'Wt :: Json :: parse()'解析它,參見https://www.webtoolkit.eu/wt/doc/reference/html/namespaceWt_1_1Json.html – RockinRoel