项目——基于C/S架构的预约系统平台(2)

今日进展:

ser.h

cpp 复制代码
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<string>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<event.h>
#include<jsoncpp/json/json.h>
#include<mysql/mysql.h>

using namespace std;

const int listenmax=10;

enum op_type{
    DL=1,
    ZC,
    CKYY,
    YD,
    CKYD,
    QXYD,
    TC
};

class mysql_client{
public:
    mysql_client(){
        db_ips="127.0.0.1";
        db_username="root";
        db_dbname="project_db";
        db_passwd="770202";
    }
    ~mysql_client(){
        mysql_close(&mysql_con);
    }

    bool mysql_connectserver();
    bool mysql_register(const string &tel,const string &passwd,const string &name);

private:
    MYSQL mysql_con;
    string db_ips;
    string db_username;
    string db_dbname;
    string db_passwd;
};

class socket_listen{
public:
    socket_listen(){
        sockfd=-1;
        m_port=6000;
        m_ips="127.0.0.1";
    }
    socket_listen(string ips,short port):m_ips(ips),m_port(port){
        sockfd=-1;
    }

    bool socket_init();
    int accept_client();

    void set_base(struct event_base*base){
        this->base=base;
    }
    int getsockfd()const{
        return sockfd;
    }
    struct event_base* get_base()const{
        return base;
    }

private:
    int sockfd;
    short m_port;
    string m_ips;
    struct event_base * base;
};


class socket_con{
public:
    socket_con(int fd):c(fd){
        c_ev=NULL;
    }
    void set_ev(struct event*ev){
        c_ev=ev;
    }
    ~socket_con(){
        event_free(c_ev);
        close(c);
    }
    void recv_data();
    void send_err();
    void send_ok();
    void user_register();
    void user_login();
   
private:
    int c;
    struct event* c_ev;

    Json::Value val;
    //mysql_client cli;
};

ser.cpp

cpp 复制代码
#include"ser.h"

bool mysql_client::mysql_connectserver(){
    MYSQL*mysql=mysql_init(&mysql_con);
    if(mysql==NULL)return false;
    
    mysql=mysql_real_connect(mysql,db_ips.c_str(),db_username.c_str(),db_passwd.c_str(),db_dbname.c_str(),3306,NULL,0);    
    if(mysql==NULL){
        cout<<"connect db server err"<<endl;
        return false;
    }
    return true;
}
bool mysql_client::mysql_register(const string &tel,const string &passwd,const string &name){
    //insert into user_info values(0,'13200000000','小王','123456',1);
    string sql=string("insert into user_info values(0,'")+tel+string("','")+name+string("','")+passwd+string("',1)");
    if(mysql_query(&mysql_con,sql.c_str())!=0)return false;
    return true;
}

//socket_listen
bool socket_listen::socket_init(){
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(-1==sockfd)return false;

    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(m_port);
    saddr.sin_addr.s_addr=inet_addr(m_ips.c_str());

    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(-1==res){
        perror("绑定失败\n");
        close(sockfd);
        return false;
    }

    res=listen(sockfd,listenmax);
    if(res==-1)return false;
    return true;
}
int socket_listen::accept_client(){
    int c=accept(sockfd,NULL,NULL);
    return c;
}

//socket_con

void socket_con::send_err(){
    Json::Value res_val;
    res_val["status"]="ERR";
    send(c,res_val.toStyledString().c_str(),strlen(res_val.toStyledString().c_str()),0);
}

void socket_con::send_ok(){
    Json::Value res_val;
    res_val["status"]="OK";
    send(c,res_val.toStyledString().c_str(),strlen(res_val.toStyledString().c_str()),0);
}

void socket_con::user_register(){
    string tel,passwd,username;
    tel=val["user_tel"].asString();
    passwd=val["user_passwd"].asString();
    username=val["user_name"].asString();

    if(tel.empty()||passwd.empty()||username.empty()){
        send_err();
    }

    mysql_client cli;
    if(!cli.mysql_connectserver()){
        send_err();
        return;
    }

    if(!cli.mysql_register(tel,passwd,username)){
        send_err();
        return;
    }
    send_ok();
    return;

}

void socket_con::user_login(){

}

void socket_con::recv_data(){
    char buff[256]={0};
    int n=recv(c,buff,255,0);
    if(n<=0){
        cout<<"client close"<<endl;
        delete this;
        return;
    }

    //测试
    cout<<"recv:"<<buff<<endl;

    Json::Reader Read;
    if(!Read.parse(buff,val)){
        cout<<"recv_data:解析json失败"<<endl;
        send_err();
        return;
    }
    int ops=val["type"].asInt();
    switch(ops){
                case DL://登陆
                user_login();
                break;
                case ZC://注册
                user_register();
                break;
                case CKYY://查看预约
                break;
                case YD://预订
                break;
                case QXYD://取消预订
                break;
                case CKYD://查看预订
                break;
                case TC://退出
                break;
            default:
            cout<<"输入无效"<<endl;
            break;
    }
    //解析
   
}


//callback
void SOCK_CON_CALLBACK(int fd,short ev,void *arg){
    socket_con*q=(socket_con*)arg;
    if(ev&EV_READ){
        q->recv_data();

    }

}

void SOCK_LIS_CALLBACK(int sockfd,short ev,void *arg){
    socket_listen* p=(socket_listen*)arg;
    if(p==NULL)return;
    
    if(ev&EV_READ){ //处理读事件
        int c=p->accept_client();
        if(c==-1)return;
        cout<<"accept:c="<<c<<endl;

        socket_con *q=new socket_con(c);
        struct event*c_ev=event_new(p->get_base(),c,EV_READ|EV_PERSIST,SOCK_CON_CALLBACK,q);
        if(c_ev==NULL){
            close(c);
            delete q;
            return;
        }
        q->set_ev(c_ev);
        //添加到libevent
        event_add(c_ev,NULL);
    }

}

int main(){
    //监听套接字
    socket_listen socket_ser;
    if(!socket_ser.socket_init()){
        cout<<"socket init err!"<<endl;
        exit(1);
    }
    //创建libevent base
    struct event_base*base=event_init();
    if(base==NULL){
        cout<<"base null"<<endl;
        exit(1);
    }

    //设置socket_listen中的libevent中的base
    socket_ser.set_base(base);

    //添加sockfd到libevent
    struct event*sock_ev=event_new(base,socket_ser.getsockfd(),EV_READ|EV_PERSIST,SOCK_LIS_CALLBACK,&socket_ser);
    event_add(sock_ev,NULL);
    //启动事件循环
    event_base_dispatch(base);//select poll epoll
    //释放资源
    event_free(sock_ev);
    event_base_free(base);


    return 0;
}

cli.h

cpp 复制代码
 #include<iostream>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<string>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<jsoncpp/json/json.h>

using namespace std;
const int offset=2;
enum op_type{DL=1,ZC,CKYY,YD,CKYD,QXYD,TC};
class socket_client{
public:
    socket_client(){
        sockfd=-1;
        ips="127.0.0.1";
        port=6000;
        dl_flg=false;
        user_op=0;
        runing=true;
        
    }
    socket_client(string ips,short port){
        sockfd=-1;
        this->ips=ips;
        this->port=port;
        dl_flg=false;
        user_op=0;
        runing=true;
    }
    void print_info();
    ~socket_client(){
        close(sockfd);
    }

    bool connnect_server();
    void user_register();
    void user_login();

    void run();
private:
    string ips;
    short port;
    int sockfd;

    bool dl_flg;

    string username;
    string usertel;

    int user_op;
    bool runing;
};  

cli.cpp

cs 复制代码
  #include"cli.h"
bool socket_client::connnect_server(){
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(-1==sockfd){
        perror("create socket err!\n");
        return false;
    }
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(port);
    saddr.sin_addr.s_addr=inet_addr(ips.c_str());
    int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res==-1){
        perror("connect ser err!\n");
        return false;
    }
    cout<<"connect to server success"<<endl;
    return true;
}
void socket_client::print_info(){
    if(dl_flg){
        cout<<"--已登陆-------用户名:"<<username<<"-------"<<endl;
        cout<<"1:查看预约   2:预订  3: 查看我的预约  4:取消预约  5:退出"<<endl;
        cout<<"-------------------------------------------------"<<endl;
        cout<<"请输入选项编号:"<<endl;
        cin>>user_op;
        user_op+=offset;
    }
    else{
        cout<<"---未登陆-----游客-----"<<endl;
        cout<<"1:登陆   2:注册  3: 退出 "<<endl;
        cout<<"-----------------"<<endl;
        cout<<"请输入选项编号:"<<endl;
        cin>>user_op;
        if(user_op==3)user_op=TC;
    }
}

void socket_client::user_register(){
    cout<<"请输入用户手机号码:"<<endl;
    cin>>usertel;
    cout<<"请输入用户名"<<endl;
    cin>>username;
    string passwd,tmp;
    cout<<"请输入密码:"<<endl;
    cin>>passwd;
    cout<<"请再次输入密码"<<endl;
    cin>>tmp;
    if(usertel.empty()||username.empty()){
        cout<<"手机或用户名不能为空"<<endl;
        return;
    }
    if(passwd.compare(tmp)!=0){
        cout<<"密码不一致"<<endl;
        return;
    }
    Json::Value val;
    val["type"]=ZC;
    val["user_tel"]=usertel;
    val["user_name"]=username;
    val["user_passwd"]=passwd;
    send(sockfd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0);
    
    char buff[256]={0};
    if(recv(sockfd,buff,255,0)<=0){
        cout<<"ser close"<<endl;
        return;
    }
    val.clear();
    Json::Reader Read;
    if(!Read.parse(buff,val)){
        cout<<"json 解析失败"<<endl;
        return;
    }

    string s=val["status"].asString();
    if(s.compare("OK")!=0){
        cout<<"注册失败"<<endl;
        return;
    }
    
    dl_flg=true;
    cout<<"注册成功"<<endl;
    return;
}
void socket_client::user_login(){
    cout<<"登陆"<<endl;
}

void socket_client::run(){
    while(true){
        print_info();
        switch(user_op){
                case DL:
                user_login();
                break;
                case ZC:
                user_register();
                break;
                case CKYY://查看预约
                break;
                case YD://预订
                break;
                case QXYD://取消预订
                break;
                case CKYD://查看预订
                break;
                case TC://退出
                runing=false;
                break;
            default:
            cout<<"输入无效"<<endl;
            break;
        }
    }

}
int main(){
    socket_client cli;
    if(!cli.connnect_server())exit(1);
    cli.run();

    exit(0);
}
相关推荐
Wang's Blog4 小时前
Linux小课堂: CentOS 7 Minimal 服务器安装与网络配置实战详解
linux·服务器·centos
Brookty4 小时前
【算法】前缀和(二)使用
java·学习·算法·前缀和·动态规划·1024程序员节
9ilk4 小时前
【同步/异步 日志系统】 --- 前置技术
笔记·后端·其他·中间件
go_bai5 小时前
Linux_基础IO(2)
linux·开发语言·经验分享·笔记·学习方法·1024程序员节
huangyuchi.5 小时前
【Linux网络】套接字Socket编程预备
linux·运维·服务器·端口号·linux网络·套接字·1024程序员节
wanhengidc5 小时前
服务器硬件设备都有哪些?
运维·服务器·网络·游戏·智能手机·架构·云计算
序属秋秋秋5 小时前
《Linux系统编程之入门基础》【权限管理】
linux·运维·服务器·笔记·学习·ubuntu·xshell
杨福瑞5 小时前
数据结构:顺序表讲解(2)
c语言·开发语言·数据结构