zoukankan      html  css  js  c++  java
  • 重构网络库

    之前的网络库以id作为会话对象的标示,但很多应用服务器的逻辑比较复杂,每个会话对象需要携带(保存)很多状态,那么开发人员总是会构建一个对象管理器。

    所以我在之前网路库封装成以C++对象为标示,作为网络事件回调以及网络接口的参数。

    这里展示的是一个pingpong协议测试程序(未分包,分包不影响此协议的效率测试)

     工程(需要VS2013)下载地址:https://files.cnblogs.com/files/irons/PingPangDemo.zip

    TcpService类就是设计的以id为对象标示的网络接口层。

    而WrapServer则是封装TCPService的,以C++对象为标示的网络接口, 其C++对象为TCPSession。

    通常使用其智能指针。

    为了博客园规矩(其实是凑数),只有贴代码了(具体代码设计,还请各位花点时间看源代码了--我这里就不多做解释了哈,有问题还请指教)

    Server:

    #include <iostream>
    #include <mutex>
    
    #include "../Net/eventloop.h"
    #include "../Net/WrapTCPService.h"
    
    std::mutex g_mutex;
    int total_recv = 0;
    int total_client_num = 0;
    
    void onSessionClose(TCPSession::PTR session)
    {
        g_mutex.lock();
        total_client_num--;
        g_mutex.unlock();
    }
    
    int onSessionMsg(TCPSession::PTR session, const char* buffer, int len)
    {
        session->send(buffer, len);
        g_mutex.lock();
        total_recv += len;
        g_mutex.unlock();
        return len;
    }
    
    int main(int argc, char **argv)
    {
        int thread_num = atoi(argv[1]);
        int port_num = atoi(argv[2]);
    
        WrapServer::PTR server = std::make_shared<WrapServer>();
    
        server->setDefaultEnterCallback([](TCPSession::PTR session){
            session->setCloseCallback(onSessionClose);
            session->setDataCallback(onSessionMsg);
    
            g_mutex.lock();
            total_client_num++;
            g_mutex.unlock();
        });
    
        server->startListen(port_num);
        server->startWorkThread(thread_num);
    
        EventLoop mainLoop;
        mainLoop.restoreThreadID();
    
        while (true)
        {
            mainLoop.loop(1000);
            g_mutex.lock();
            std::cout << "total recv : " << (total_recv / 1024) / 1024 << " M /s, of client num:" << total_client_num << std::endl;
            total_recv = 0;
            g_mutex.unlock();
        }
    }

    Client:

    #include <iostream>
    #include <string>
    
    #include "../Net/socketlibfunction.h"
    #include "../Net/WrapTCPService.h"
    
    void onSessionClose(TCPSession::PTR session)
    {
    }
    
    int onSessionMsg(TCPSession::PTR session, const char* buffer, int len)
    {
        session->send(buffer, len);
        return len;
    }
    
    int main(int argc, char **argv)
    {
        int thread_num = atoi(argv[1]);
        int port_num = atoi(argv[2]);
        int num = atoi(argv[3]);
        int packet_len = atoi(argv[4]);
    
        std::string tmp(packet_len, 'a');
    
        WrapServer::PTR server = std::make_shared<WrapServer>();
    
        server->startWorkThread(thread_num);
    
        for (int i = 0; i < num; i++)
        {
            sock fd = ox_socket_connect("127.0.0.1", port_num);
            server->addSession(fd, [&](TCPSession::PTR session){
                session->setCloseCallback(onSessionClose);
                session->setDataCallback(onSessionMsg);
                session->send(tmp.c_str(), tmp.size());
            });
        }
    
        std::cin.get();
    }

    tks。

  • 相关阅读:
    开启nginx缓存
    xsl输出html代码 非闭合
    记一次网络波动导致druid连接池无法创建新连接的BUG
    mysql时间操作
    JVM知识点精华汇总
    java 基础 ---HashMap、HashTable
    java面试--小谈如何面试
    Spring框架
    JAVA+微信支付APP开发+支付宝支付APP开发
    消息队列
  • 原文地址:https://www.cnblogs.com/irons/p/4613637.html
Copyright © 2011-2022 走看看