gì tôi đã kết thúc sử dụng là một cách tiếp cận khác nhau như TCPServer là một con thú khác nhau hoàn toàn. Theo ví dụ được đăng here Tôi đã kết thúc với một lớp kế thừa từ ServerApplication và một lớp về cơ bản là kết nối handler bởi một SocketReactor.
Deamonizer tiêu đề:
class Daemon : public ServerApplication
{
public:
Daemon();
/// @Brief The main loop of the daemon, everything must take place here
int main();
};
Deamonizer thực hiện:
int Daemon::main()
{
// Server Socket
ServerSocket svs(2222);
// Reactor-Notifier
SocketReactor reactor;
Poco::Timespan timeout(2000000); // 2Sec
reactor.setTimeout(timeout);
// Server-Acceptor
SocketAcceptor<ConnectionHandler> acceptor(svs, reactor);
// Threaded Reactor
Thread thread;
thread.start(reactor);
// Wait for CTRL+C
waitForTerminationRequest();
// Stop Reactor
reactor.stop();
thread.join();
return Application::EXIT_OK;
}
Lớp xử lý có thể được bất cứ điều gì miễn là nó có một Constructor phù hợp (xem tài liệu Poco :: Net cho việc này). Trong trường hợp của tôi header trông như thế này:
class ConnectionHandler
{
public:
/**
* @Brief Constructor of the Connection Handler
* @Note Each object is unique to an accepted connection
* @Param SteamSocket is the socket accepting the connections
* @See SocketAcceptor http://pocoproject.org/docs/Poco.Net.SocketAcceptor.html
* @Param SocketReactor is the reacting engine (threaded) which creates notifications about the socket
*/
ConnectionHandler(StreamSocket &, SocketReactor &);
/**
* @Brief Destructor
*/
~ConnectionHandler();
/**
* @Brief Event Handler when Socket becomes Readable, i.e: there is data waiting to be read
*/
void onSocketReadable(const AutoPtr<ReadableNotification>& pNf);
/**
* @Brief Event Handler when Socket was written, i.e: confirmation of data sent away (not received by client)
*/
void onSocketWritable(const AutoPtr<WritableNotification>& pNf);
/**
* @Brief Event Handler when Socket was shutdown on the remote/peer side
*/
void onSocketShutdown(const AutoPtr<ShutdownNotification>& pNf);
/**
* @Brief Event Handler when Socket throws an error
*/
void onSocketError(const AutoPtr<ErrorNotification>& pNf);
/**
* @Brief Event Handler when Socket times-out
*/
void onSocketTimeout(const AutoPtr<TimeoutNotification>& pNf);
private:
/**
* @Brief Read bytes from the socket, depending on available bytes on socket
*/
void readBytes();
/**
* @Brief Send message to the socket
* @Param std::string is the message (null terminated)
*/
void sendMessage(std::string);
/// Stream Socket
StreamSocket _socket;
/// Socket Reactor-Notifier
SocketReactor& _reactor;
/// Received Data Buffer
std::vector<char *> in_buffer;
};
Làm thế nào bạn thực hiện xử lý là tùy thuộc vào bạn, với điều kiện là điều duy nhất mà bạn cần phải làm là đăng ký phương pháp lớp học mà xử lý các sự kiện như vậy:
_reactor.addEventHandler(_socket,NObserver<ConnectionHandler, ReadableNotification>(*this, &ConnectionHandler::onSocketReadable));
_reactor.addEventHandler(_socket,NObserver<ConnectionHandler, ShutdownNotification>(*this, &ConnectionHandler::onSocketShutdown));
_reactor.addEventHandler(_socket,NObserver<ConnectionHandler, ErrorNotification>(*this, &ConnectionHandler::onSocketError));
_reactor.addEventHandler(_socket,NObserver<ConnectionHandler, TimeoutNotification>(*this, &ConnectionHandler::onSocketTimeout));
Tất cả trong tất cả, hai lớp, một vài dòng mã, đơn giản và rõ ràng. Tuyệt đối bắt đầu yêu thư viện Poco! :)
Lò phản ứng tốt :) Cảm ơn Alex –