Могут ли несколько приложений WT работать на одном порту?

Обновление 1: я недавно узнал, что WT связывается с помощью TCP (HTTP), если это кому-нибудь помогает.

Название говорит само за себя, возможно ли запускать 2 разных приложения или проекта WT на одном и том же порту? Я знаю, что WT установил контроль над тем, как приложение размещается с его параметрами запуска, следующим образом. Я использую Visual Studio 2010 и параметры, указанные ниже, вводятся в поле аргументов отладки-> команды следующим образом:

--http-address=0.0.0.0 --http-port=8080 --deploy-path=/hello --docroot=.

Приведенные выше параметры потребуют, чтобы пользователь открыл веб-страницу по адресу

http://127.0.0.1:8080/hello

Так что я, эй, что делать, если я принимаю другой проект с параметрами ниже

--http-address=0.0.0.0 --http-port=8080 --deploy-path=/world --docroot=.

так что тогда мне нужно будет подключиться к

http://127.0.0.1:8080/world

Вышеупомянутое на самом деле не работает, оно только размещает первое приложение, которое подключается, а второе не будет подключаться, пока первое не отключится. Так что это приводит меня сюда. Существуют ли другие способы запуска нескольких приложений WT на одном и том же порту?

Спасибо заранее за любую помощь!

3

Решение

Да, вы можете достичь этого, но вам нужно будет создать свой собственный WRun и использовать addEntryPoint, Это на самом деле упоминается в руководство и идет следующим образом:

Внутри WRun ()

WRun () на самом деле удобная функция, которая создает и настраивает экземпляр WServer. Если вам нужен больший контроль, например, если у вас есть несколько «точек входа» или вы хотите контролировать запуск и остановку сервера, вы можете вместо этого напрямую использовать API WServer.

Здесь у вас есть пример, оба приложения являются приложением Hello World, но обратите внимание, что у них разные заголовки и разные сообщения на кнопках и при их нажатии. Вы можете найти другую реализацию WRun на src/http/Serve.C а также src/Wt/WServer,

two_helloworlds.cc

#include <Wt/WApplication>
#include <Wt/WBreak>
#include <Wt/WContainerWidget>
#include <Wt/WLineEdit>
#include <Wt/WPushButton>
#include <Wt/WText>
#include <Wt/WException>
#include <Wt/WLogger>
#include <Wt/WServer>

class HelloApplication : public Wt::WApplication
{
public:
HelloApplication(const Wt::WEnvironment& env, const std::string& title);

private:
Wt::WLineEdit *nameEdit_;
Wt::WText *greeting_;

void greet();
};

HelloApplication::HelloApplication(const Wt::WEnvironment& env, const std::string& title)
: Wt::WApplication(env)
{
setTitle(title);

root()->addWidget(new Wt::WText("Your name, please ? "));
nameEdit_ = new Wt::WLineEdit(root());
Wt::WPushButton *button = new Wt::WPushButton("Greet me.", root());
root()->addWidget(new Wt::WBreak());
greeting_ = new Wt::WText(root());
button->clicked().connect(this, &HelloApplication::greet);
}

void HelloApplication::greet()
{    greeting_->setText("Hello there, " + nameEdit_->text());
}
class GoodbyeApplication : public Wt::WApplication{
public:
GoodbyeApplication(const Wt::WEnvironment& env, const std::string& title);

private:    Wt::WLineEdit *nameEdit_;
Wt::WText *greeting_;void greet();
};

GoodbyeApplication::GoodbyeApplication(const Wt::WEnvironment& env, const std::string& title)
: Wt::WApplication(env)
{
setTitle(title);

root()->addWidget(new Wt::WText("Your name, please ? "));
nameEdit_ = new Wt::WLineEdit(root());
Wt::WPushButton *button = new Wt::WPushButton("Say goodbye.", root());
root()->addWidget(new Wt::WBreak());
greeting_ = new Wt::WText(root());
button->clicked().connect(this, &GoodbyeApplication::greet);
}

void GoodbyeApplication::greet()
{
greeting_->setText("Goodbye, " + nameEdit_->text());
}

Wt::WApplication *createApplication(const Wt::WEnvironment& env)
{
return new HelloApplication(env, "First app");
}

Wt::WApplication *createSecondApplication(const Wt::WEnvironment& env)
{
return new GoodbyeApplication(env, "Second app");
}

int YourWRun(int argc, char *argv[], Wt::ApplicationCreator createApplication, Wt::ApplicationCreator createSecondApplication)
{
try {
// use argv[0] as the application name to match a suitable entry
// in the Wt configuration file, and use the default configuration
// file (which defaults to /etc/wt/wt_config.xml unless the environment
// variable WT_CONFIG_XML is set)
Wt::WServer server(argv[0],"");

// WTHTTP_CONFIGURATION is e.g. "/etc/wt/wthttpd"server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION);

// add a single entry point, at the default location (as determined
// by the server configuration's deploy-path)
server.addEntryPoint(Wt::Application, createApplication);
server.addEntryPoint(Wt::Application, createSecondApplication,"/second");
if (server.start()) {
int sig = Wt::WServer::waitForShutdown(argv[0]);

std::cerr << "Shutdown (signal = " << sig << ")" << std::endl;
server.stop();

/*
if (sig == SIGHUP)
WServer::restart(argc, argv, environ);
*/
}
} catch (Wt::WServer::Exception& e) {
std::cerr << e.what() << "\n";
return 1;
} catch (std::exception& e) {
std::cerr << "exception: " << e.what() << "\n";
return 1;
}
}

int main(int argc, char **argv)
{
return YourWRun(argc, argv, &createApplication, &createSecondApplication);
}

Скомпилируйте это с

g++ -g -o two_helloworlds two_helloworlds.cc -I/usr/local/include -L/usr/local/lib -lwthttp -lwt -lboost_random -lboost_regex -lboost_signals -lboost_system -lboost_thread -lboost_filesystem -lboost_program_options -lboost_date_time

и выполнить с

./two_helloworlds --docroot . --http-address 0.0.0.0 --http-port 8080

на localhost:8080 вы получите доступ к одному из приложений и на localhost:8080/second вы получите доступ к другому.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]