2017-08-14 76 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