第一个项目:基于TCP的聊天项目

  1. 主要功能实现:

    Register   Login  TalkToOne  TalkToGroup  GetList   Exit。

  2. 使用工具:

    Json打包数据  Libevent实现I/O复用  mysql数据库存储用户相关信息及离线消息。

  3. 项目框架:

    Cli:

    提供用户选择服务:Register、Login、Geilist、Talk to one、Talk to group、exit。

    用户需选择服务,输入相关信息

    根据不同服务调用相应功能函数

    利用json打包数据发送给服务器

    接收到服务器的回应后,若登陆成功,需要启动线程接收消息并打印

    用户再次选择之后的服务。

     

    Ser:

    利用半同步半反应堆完成线程间任务分工

    主线程接收连接,将套接字分给当前较为空闲的子线程监听

    通过socket_pair实现父子线程间信息交互

    子线程通过libevent实现I/O复用,当有事件来的时候通过MVC处理

    根据请求类型的不同,使用相应的视图来处理。

    感谢老师梳理的框架030 ser框架如图

  4. 项目实现:

    Cli部分代码:

    //fun.cpp

    string myname;

    void *pth_run(void *arg)

    {

    int c = (int) arg;

    char buff[1024] = {0};

    int n = recv(c,buff,1023,0);

    while(n != 0)

    {

    cout<<"\033[36m"<

    memset(buff,0,1024);

    n = recv(c,buff,1023,0);

    }

    }

     

     

    void do_register(int fd)

    {

    string name;

    string pw;

    //让用户输入name   pw

    cout<<"-->  your name:  "<

    cin>>name;

    cout<<"-->  your password:  "<

    cin>>pw;

    //JSON 打包数据

    Json::Value val;

    val["reason_type"] = MSG_TYPE_REGISTER;

    val["name"] = name;

    val["pw"] = pw;

     

    //发送到服务器

    if(-1 == send(fd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0))

    {

    cerr<<"//send reason fail;errno:"<

    return;

    }

     

    //接受服务器消息(判断success/error)

    char buff[256] = {0};

    if(0 < recv(fd,buff,255,0))

    {

    if(strncmp(buff,"register sucess!",16) == 0)

    {

    cout<<"-----register sucess!-----"<

    return;

    }

    }

     

    cerr<<"//register fail;"<

     

     

    }

     

    void do_login(int fd)

    {

    bool success = false;

    string name;

    string pw;

     

    //让用户输入name   pw

    cout<<"-->  your name:  "<

    cin>>name;

    cout<<"-->  your password:  "<

    cin>>pw;

    //Json打包数据

    Json::Value val;

    val["reason_type"] = MSG_TYPE_LOGIN;

    val["name"] = name;

    val["pw"] = pw;

    //发送

    if(-1 == send(fd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0))

    {

    cerr<<"send reason fail;errno:"<

    return;

    }

     

    //接受服务器回应(判断success/error)

    char buff[256] = {0};

    if(0 < recv(fd,buff,255,0))

    {

    if(strncmp(buff,"login sucess!",13) == 0)

    {

    cout<<"----- \033[35m"<

    success = true;

    }

    else cout<<"//login fail!"<

     

    }

     

    if(success)

    {

    //启动一个线程(专门接受数据和打印数据)

    myname = name;

    while(1)

    {

    cout<<"\033[31m1. get list  2. talk to one  3.talk to group  4.exit\n\033[0m"<

    cout<<"--------------------------------------------------"<

    pthread_t id;

    pthread_create(&id,NULL,pth_run,(void *)fd);

    int c;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部