QT-在线词典

来源:互联网 发布:手机上怎么删淘宝评论 编辑:程序博客网 时间:2024/04/28 05:15

Ubuntu-服务器(process.c):


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sqlite3.h>
#include<time.h>
#define DATABASE "my.db"
typedef struct
{
int type;
char name[20];
char data[256];
}Mg;
void handler(int sig);
void do_register(int connfd,Mg *mg,sqlite3 *db);
void do_login(int connfd,Mg *mg,sqlite3 *db);
void do_client(int connfd,sqlite3 *db);
void do_history(int sockfd,Mg *mg,sqlite3 *db);
void do_query(int sockfd,Mg *mg,sqlite3 *db);
void get_date(char date[]);
int do_searchword(int connfd,Mg *mg);
int history_callback(void *arg,int f_num,char **f_value,char **f_name);


void do_register(int connfd,Mg *mg,sqlite3 *db)
{
char sqlstr[128];
char *errmsg;
sprintf(sqlstr ,"insert into user values ('%s','%s')",mg->name,mg->data);
printf("%s\n",sqlstr);
if(sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg)!=SQLITE_OK)
{
sqlite3_free(errmsg);
strncpy(mg->data,"user already exist!",256);
}
else
{
strncpy(mg->data,"register ok!",256);
}
send(connfd,mg,sizeof(Mg),0);
return;
}
void do_login(int connfd,Mg *mg,sqlite3 *db)
{
char sqlstr[128];
char *errmsg;
char **result;
int row;
int column;
sprintf(sqlstr,"select *from user where name = '%s' and pass = '%s'",mg->name,mg->data);
if(sqlite3_get_table(db,sqlstr,&result,&row,&column,&errmsg)!=SQLITE_OK)
{
printf("error:%s\n",errmsg);
sqlite3_free(errmsg);
}
if(row == 0)
{
strncpy(mg->data,"name or passwd is wrong!",256);
}
else
{
strncpy(mg->data,"log in ok!",256);
mg->type = 3;
}
send(connfd,mg,sizeof(Mg),0);
sqlite3_free_table(result);
return;
}
void get_date(char date[])
{
time_t t;
struct tm *tp;
time(&t);
tp = localtime(&t);
strftime(date,64,"%Y-%m-%d %H:%M:%S",tp);
return;
}
int do_searchword(int connfd,Mg *mg)
{
FILE *fp;
char s[256];
char *p;
if((fp = fopen("dirt.txt","r"))== NULL)
{
strcpy(mg->data,"dirt on server can't be opened:");
send(connfd,mg,sizeof(Mg),0);
}
printf("query word is %s\n",mg->data);
while(fgets(s,300,fp)!=NULL)
{
if(0 == strncmp(mg->data,s,strlen(mg->data)))
{
p = s+strlen(mg->data);
while(0==strncmp(p," ",1))p++;
strcpy(mg->data,p);
send(connfd,mg,sizeof(Mg),0);
fclose(fp);
return 1;
}
}
fclose(fp);
return 0;
}
void do_client(int connfd,sqlite3 *db)
{
Mg mg;
while(recv(connfd,&mg,sizeof(mg),0)>0)
{
switch(mg.type)
{
case 1:do_register(connfd,&mg,db);
  break;
case 2:do_login(connfd,&mg,db);
  break;
case 3:do_query(connfd,&mg,db);
  break;
case 4:do_history(connfd,&mg,db);
  break;
}
}
printf("client quit\n");
exit(0);
return;
}
int history_callback(void *arg,int f_num,char **f_value,char **f_name)
{
int connfd;
Mg mg;
connfd = *(int*)arg;
sprintf(mg.data,"%s:%s",f_value[1],f_value[2]);
send(connfd,&mg,sizeof(mg),0);
return 0;
}
void do_history(int sockfd,Mg *mg,sqlite3 *db)
{
char sqlstr[128],*errmsg;
sprintf(sqlstr,"select * from record where name = '%s'",mg->name);
if(sqlite3_exec(db,sqlstr,history_callback,(void *)&sockfd,&errmsg)!=SQLITE_OK);
{
printf("error:%s\n",errmsg);
sqlite3_free(errmsg);
}
mg->data[0]='\0';
send(sockfd,mg,sizeof(Mg),0);
return ;
}
void do_query(int sockfd,Mg *mg,sqlite3 *db)
{
char sqlstr[128],*errmsg;
int found = 0;
char date[64],word[64];
strcpy(word,mg->data);
found = do_searchword(sockfd,mg);
if(found)
{
get_date(date);
sprintf(sqlstr,"insert into record values ('%s','%s','%s')",mg->name,date,word);
if(sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("error:%s\n",errmsg);
sqlite3_free(errmsg);
}
}
else
{
strcpy(mg->data,"not found\n");
}
send(sockfd,mg,sizeof(Mg),0);
return ;
}
void handler(int sig) //当子进程退出,回收子进程资源
{
printf("child exit\n");
while (waitpid(-1, NULL, WNOHANG) > 0);
}




int main(int argc, char *argv[])
{
int listenfd;
int ret;
socklen_t addrlen;
int connfd;
char buf[256];
struct sockaddr_in srvaddr;
struct sockaddr_in cltaddr;
pid_t pid;
sqlite3 *db;
if(sqlite3_open(DATABASE,&db)!=SQLITE_OK)
{
printf("error;%s\n",sqlite3_errmsg(db));
exit(-1);
}


listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd == -1) {
perror("server->socket");
return -1;
}
printf("create listenfd = %d success\n", listenfd);


memset(&srvaddr, 0, sizeof(struct sockaddr_in));
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(9999);
srvaddr.sin_addr.s_addr = inet_addr("192.168.6.138");
ret = bind(listenfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));
if (ret == -1) {
perror("server->bind");
return -1;
}
printf("bind success !\n");


ret = listen(listenfd, 1024);
if (ret == -1) {
perror("server->listen");
return -1;
}
printf("listen success !\n");


signal(SIGCHLD, handler);


while(1) {
memset(&cltaddr, 0, sizeof(cltaddr));
addrlen = sizeof(cltaddr);
connfd = accept(listenfd, (struct sockaddr *)&cltaddr, &addrlen);
if (connfd == -1) {

return -1;
}
printf("connect connfd = %d\n", connfd);
char *p = inet_ntoa((struct in_addr)cltaddr.sin_addr);
printf("clt->ip : %s\n", p);
printf("clt->port : %d\n", ntohs(cltaddr.sin_port));
pid = fork();
if (pid == -1) {
perror("server->fork");
return -1;
} else if (pid == 0) {

do_client(connfd,db);


close(connfd);
}
close(listenfd);
return 0;
}

QT-客户端:

widget.h

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>
#include <QDebug>
#include <QHostAddress>
#include <QTcpSocket>
#include <QMessageBox>
#include "search.h"


typedef struct
{
    int type;
    char name[20];
    char data[256];
}Mg;


namespace Ui {
class Widget;
}


class Widget : public QWidget
{
    Q_OBJECT


public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
public slots:
    void send_msg();
    void recv_msg();


private slots:


    void on_reg_clicked();


    void on_log_clicked();


    void on_quit_clicked();


private:
    Ui::Widget *ui;
    QTcpSocket *tcpclient;
};

#endif // WIDGET_H


widget.cpp:


#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("系统登录注册界面");
    tcpclient = new QTcpSocket(this);
    tcpclient->connectToHost("192.168.6.138",9999);//INADDR_ANY
    if(tcpclient->waitForConnected())
        qDebug()<<"connect server success...";
    else
        qDebug()<<"connect server fail...";
    // connect(ui->le1,SIGNAL(returnPressed()),this,SLOT(send_msg()));//发送的信号槽
    // connect(ui->le2,SIGNAL(returnPressed()),this,SLOT(send_msg()));//发送的信号槽
    connect(tcpclient,SIGNAL(readyRead()),this,SLOT(recv_msg()));//接收的信号槽
}


Widget::~Widget()
{
    delete ui;
}
void Widget::send_msg()
{


}


void Widget::recv_msg()
{
    Mg mg;
    tcpclient->read((char *)(&mg),sizeof(Mg));


    /*打印注册或登陆的成功或失败信息*/
    QMessageBox msgBox;
    msgBox.setText(mg.data);
    msgBox.exec();


    /*打印注册或登陆的成功或失败信息*/
    qDebug()<<"****************";


    qDebug()<<mg.name<<  mg.data;


    qDebug()<<"****************";


    /*打印注册或登陆的成功或失败信息*/
    ui->textEdit->append(mg.data);


    /*登陆成功则跳转*/


    if(mg.type == 3)
    {
        /*跳转到查询界面*/
        Search *p = new Search;
        p->show();
    }




}


void Widget::on_reg_clicked()
{
    Mg mg;
    mg.type = 1;
    strcpy(mg.name,ui->le1->text().toStdString().c_str());
    strcpy(mg.data,ui->le2->text().toStdString().c_str());
    if(strlen(mg.data)!=0 && strlen(mg.name)!=0)
    {
        tcpclient->write((char *)(&mg),sizeof(Mg));
    }
    else
    {
        QMessageBox msgBox;
        msgBox.setText("user or passwd can't be empty!");
        msgBox.exec();


    }
    qDebug()<<"name: "<<mg.name<<"  "<<"passwd: "<<mg.data<<endl;
    ui->le1->clear();
    ui->le2->clear();


}


void Widget::on_log_clicked()
{
    Mg mg;
    mg.type = 2;
    strcpy(mg.name,ui->le1->text().toStdString().c_str());
    strcpy(mg.data,ui->le2->text().toStdString().c_str());
    if(strlen(mg.data)!=0 && strlen(mg.name)!=0)
    {
        tcpclient->write((char *)(&mg),sizeof(Mg));
    }
    else
    {
        QMessageBox msgBox;
        msgBox.setText("user or passwd can't be empty!");
        msgBox.exec();


    }
    qDebug()<<"name: "<<mg.name<<"  "<<"passwd: "<<mg.data<<endl;
    ui->le1->clear();
    ui->le2->clear();




}


void Widget::on_quit_clicked()
{
    qDebug()<<"exit success!";
    exit(0);
}


search.h:

#ifndef SEARCH_H
#define SEARCH_H


#include <QDialog>
#include <QDebug>
#include <QHostAddress>
#include <QTcpSocket>
#include "widget.h"
namespace Ui {
class Search;
}


class Search : public QDialog
{
    Q_OBJECT


public:
    explicit Search(QWidget *parent = 0);
    ~Search();
public slots:
    void reg_send_msg();
    void reg_recv_msg();




private slots:
    void on_pt_clicked();


    void on_pt1_clicked();


    void on_pt2_clicked();


    void on_pt3_clicked();


private:
    Ui::Search *ui;
    QTcpSocket *seaclient;
};


#endif // SEARCH_H


search.cpp:

#include "search.h"
#include "ui_search.h"


Search::Search(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Search)
{
    ui->setupUi(this);
    setWindowTitle("查询界面");
    seaclient = new QTcpSocket(this);
    seaclient->connectToHost("192.168.6.138",9999);//INADDR_ANY
    if(seaclient->waitForConnected())
        qDebug()<<"connect server success...";
    else
        qDebug()<<"connect server fail...";
    //connect(ui->le1,SIGNAL(returnPressed()),this,SLOT(reg_send_msg()));//发送的信号槽
    //connect(ui->le2,SIGNAL(returnPressed()),this,SLOT(reg_send_msg()));//发送的信号槽
    connect(seaclient,SIGNAL(readyRead()),this,SLOT(reg_recv_msg()));//接收的信号槽


}


Search::~Search()
{
    delete ui;
}




void Search::reg_send_msg()
{




}
void Search::reg_recv_msg()
{
    Mg mg;
    seaclient->read((char *)(&mg),sizeof(Mg));
    ui->le2->setText(mg.data);
    ui->te->append(mg.data);
}
/*查询单词*/
void Search::on_pt1_clicked()
{
    Mg mg;
    mg.type = 3;
    strcpy(mg.data,ui->le1->text().toStdString().c_str());
    seaclient->write((char *)(&mg),sizeof(Mg));
}
/*退出查询界面*/
void Search::on_pt2_clicked()
{
    qDebug()<<"exit search success!";
    //exit(0);//退出所有进程...
    this->close();
}


/*历史记录*/
void Search::on_pt3_clicked()
{
    Mg mg;
    mg.type = 4;
    seaclient->write((char *)(&mg),sizeof(Mg));
}




原创粉丝点击