• TcpServer 使用简介


     

    1、简介 
    1) Poco 的 TcpServer 是一个多线程的 Tcp 服务器。 
    服务器使用 ServerSocket(Poco 的一个用于初始化服务器的socket的类) 来接收链接。ServerSocket 在被传给 TcpServer 之前必须是处于监听状态。 
    2) TcpServer 为到来的链接维护一个队列。队列是多大呢?默认情况下队列的大小是和线程池的大小一样。 
    3) 当然你也可以去设定 TcpServer 的各个参数来适合自己的实际环境。通过 Poco::Net::TCPServerParams ;
    TcpServerParam 类 可以设定最大队列,最大线程数,设定线程空闲时间,设定 TcpServer 的线程优先级(通常高点比较好)。需要注意的是 TcpServerParam 类只能通过指针使用因为它的析构是 protocted。 
    4) 不定数量的线程从队列获取链接,并去处理链接。工作的线程数是自动调整的。依赖于在队列里等待的链接的个数。 
    通过限制在队列里的 connection 数量,是可以防止服务器被大量的数据淹没。到来的的 connection 超过队列的限制,会被立即关闭。

    2、TcpServer 的使用 
    1) 创建自己的线程用于接收链接请求,并且把建立的 connection 放进队列。 
    2) 使用 TcpServerConnection 类来响应一个链接。用户必须创建一个 TcpServerConnection 的子类和一个 TcpServerConnectionFavtory 的子类。 
    TcpServer 的构造函数里必须传入这个 TcpServerConnectionFactory 的子类。 
    这里 TcpServerConnectionFactory 的子类是 CZhiTcpServer

    在TcpServer 构造的适合传入一个 TcpServerConnectionFactory 的子类对象。你也可以传入 TcpServerParam 对象来指定 TcpServer 对象的其他特性。

    在 TcpServerConnectionFactory 的子类里必须重载  virtual TCPServerConnection* createConnection(const StreamSocket& socket) = 0; 在 createConnection() 方法里 return 一个用户定义的处理请求的 TcpServerConnection 的子类。

    3、完整代码:

     1 #include <Poco/Net/ServerSocket.h>
     2 #include <Poco/Net/TCPServer.h>
     3 #include <Poco/Net/TCPServerConnectionFactory.h>
     4 #include <Poco/Net/TCPServerConnection.h>
     5 #include <Poco/Net/StreamSocket.h>
     6 #include <Poco/Timespan.h>
     7 
     8 
     9 #include <iostream>
    10 #include <sstream>
    11 
    12 using Poco::Net::TCPServerConnectionFactory;
    13 using Poco::Net::TCPServerConnection;//构造函数需要 StreamSocket
    14 using Poco::Net::StreamSocket;
    15 
    16 class CZhiTcpServerConnection : public TCPServerConnection
    17 {
    18 public:
    19     CZhiTcpServerConnection( const StreamSocket& s ):
    20         TCPServerConnection( s )
    21     {
    22 
    23     }
    24 
    25     void run( void );
    26 
    27 };
    28 
    29 /**
    30  * @brief CZhiTcpServerConnection::run 处理链接请求的主函数
    31  */
    32 void CZhiTcpServerConnection::run( void )
    33 {
    34     try
    35     {
    36         std::cout << "hello world" << std::endl;
    37         char buf[ 1024 ] = { 0 };
    38 
    39         socket().receiveBytes( buf, 1024 );
    40         std::stringstream ssbuf( buf );
    41 
    42         std::cout << "recvData: " << ssbuf.str() << std::endl;
    43         socket().sendBytes( ssbuf.str().data(),ssbuf.str().length() );
    44     }
    45     catch( std::exception& e )
    46     {
    47         std::cout << e.what() << std::endl;
    48     }
    49 }
    50 
    51 
    52 
    53 
    54 class CZhiTcpServer : public TCPServerConnectionFactory
    55 {
    56 public:
    57 
    58     inline TCPServerConnection* createConnection(const StreamSocket &socket)
    59     {
    60         return new CZhiTcpServerConnection( socket );
    61     }
    62 
    63 };
    64 
    65 
    66 
    67 int main()
    68 {
    69     Poco::Net::ServerSocket serverSocket( 8080 );
    70     Poco::Timespan timeout( 10, 0 );
    71     serverSocket.setReceiveTimeout( timeout );
    72     Poco::Net::TCPServerParams::Ptr param = new Poco::Net::TCPServerParams;
    73     //设定队列的最大长度。
    74     param->setMaxQueued( 100 );
    75     //设定 TcpServer 最大线程的个数。
    76     param->setMaxThreads( 100 );
    77     Poco::Net::TCPServer server( new CZhiTcpServer, serverSocket );
    78     server.start();
    79     while( 1 )
    80     {
    81         sleep( 10 );
    82     }
    83     server.stop( );
    84 }
  • 相关阅读:
    Head First设计模式之观察者模式
    Head First设计模式之策略模式
    EF使用Fluent API配置映射关系
    js判断空字符串、null、undefined、空格、中文空格
    从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
    System.Data.SqlClient.SqlException: 数据类型 text 和 varchar 在 equal to 运算符中不兼容。
    Content-Type的几种常用数据编码格式
    如何通过Git GUI将自己本地的项目上传至Github
    微信小程序开发之模板
    获取图片的EXIF信息
  • 原文地址:https://www.cnblogs.com/soqu36/p/7280443.html
Copyright © 2020-2023  润新知