内容比较简单,这里直接给出源码
QT客户端
头文件
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_2_clicked();
void net_recv();
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTcpSocket *tcp_socket;
};
#endif // WIDGET_H
代码模块
#include “widget.h”
#include “ui_widget.h”
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
tcp_socket = new QTcpSocket;
/连接服务器/
tcp_socket->connectToHost(“192.168.21.103”,8888);
/关联重要信号//当接收到数据,产生信号,执行net_recv()/
connect(tcp_socket,SIGNAL(readyRead()),this,SLOT(net_recv()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::net_recv()
{
/读取数据/
char buf[512];
memset(buf,0,sizeof(buf));
tcp_socket->read(buf,sizeof(buf));
qDebug() << buf;
QString str = buf;
QMessageBox::about(this,tr(“提示信息”),tr(str.toLatin1()));
}
void Widget::on_pushButton_2_clicked()
{
/注册按钮/
/*发送数据*/
QString str = 'R' + ui->lineEdit_2->text() + '#' + ui->lineEdit->text();
/*str转char*类型,str toLatin1()*/
tcp_socket->write(str.toLatin1());
}
void Widget::on_pushButton_clicked()
{
/登录按钮/
/发送数据/
QString str = ‘L’ + ui->lineEdit_2->text() + ‘#’ + ui->lineEdit->text();
/str转char类型,str toLatin1()*/
tcp_socket->write(str.toLatin1());
}
main.cpp
#include “widget.h”
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
UI设计界面
服务器使用uboot编写
代码块
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <dirent.h>
#include <sqlite3.h>
int tcp_init(const char *ip,int port) //tcp服务器初始化
{
int sockfd;
int ret;
sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字(TCP)
/* 创建一张空卡addr */
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip); //填写自己的ip
ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); //绑定地址信息
if(ret==-1){
perror("bind");
return -1;
}
listen(sockfd,50); //设置监听队列 队列长度32
return sockfd;
}
int do_client(int connfd) //处理客户请求
{
char buf[512];
char data[512];
int ret;
while(1){
memset(buf,0,sizeof(buf));
ret = recv(connfd,buf,sizeof(buf),0);
if(ret<=0){
printf("客户端退出\n");
close(connfd);
exit(0); //结束进程
}
printf("recv:%dbytes,buf:%s\n",ret,buf);
//解析客户端的请求 根据请求给响应数据
if(*buf=='R'){
printf("注册请求:%s\n",buf+1);
char name[32];
char paswd[32];
/*分离账号密码*/
char *ptr = strstr(buf+1,"#");
strcpy(paswd,ptr+1);
*ptr = 0;
strcpy(name,buf+1);
printf("name:%s\n",name);
printf("paswd:%s\n",paswd);
sqlite3 *db;
int ret = sqlite3_open("my.db",&db); //打开数据库
if(ret!=SQLITE_OK){
printf("sqlite3_open failed\n");
exit(-1);
}
//插入数据库(插入用户信息)
char sql[256];
snprintf(sql,sizeof(sql),"insert into user values('%s','%s')",name,paswd);
printf("sql:%s\n",sql);
char *errmsg;
ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(ret!=SQLITE_OK){
write(connfd,"sign up failed",14);
printf("sqlite3_exec :%s\n",errmsg);
//exit(-1);
}
else
{
write(connfd,"sign up succeed",15);
}
sqlite3_close(db); //关闭数据库
}
else if(*buf=='L'){
printf("登录请求:%s\n",buf+1);
char name[32];
char paswd[32];
char *ptr = strstr(buf+1,"#");
strcpy(paswd,ptr+1);
*ptr = 0;
strcpy(name,buf+1);
printf("name:%s\n",name);
printf("paswd:%s\n",paswd);
sqlite3 *db;
int ret = sqlite3_open("my.db",&db); //打开数据库
if(ret!=SQLITE_OK){
printf("sqlite3_open failed\n");
exit(-1);
}
//查询数据库(匹配用户信息)
char sql[256];
snprintf(sql,sizeof(sql),"select * from user where name='%s' and passwd='%s' ",name,paswd);
printf("sql:%s\n",sql);
char **resultp;
int nrow;
int ncolumn;
char *errmsg;
ret =sqlite3_get_table(db,sql,&resultp,&nrow, &ncolumn, &errmsg);
if(ret!=SQLITE_OK){
write(connfd,"sign in failed",14);
printf("sqlite3_get_table:%s\n",errmsg);
//exit(-1);
}
else
{
/*nrow是判断之后查询到的记录数目
* 未查询到不会报错,而是nrow = 0*/
if(nrow == 1){
write(connfd,"sign in succeed",15);
}
else{
write(connfd,"sign in failed",14);
}
}
printf("nrow:%d\n",nrow);
sqlite3_close(db); //关闭数据库
}
}
}
void signal_handler(int sig)
{
//waitpid(-1,NULL,WNOHANG);
while(waitpid(-1,NULL,WNOHANG)>0);
}
int main(void)
{
signal(SIGCHLD,signal_handler); //僵尸处理
int sockfd,connfd;
int ret;
sockfd = tcp_init(“192.168.21.103”,8888);
if(sockfd==-1){
exit(-1);
}
while(1){
printf("wait for connect...\n");
connfd = accept(sockfd, NULL,NULL); //建立连接 阻塞
if(connfd==-1){
if(errno == EINTR){
continue; //避免被信号打扰
}
else{
perror("accept");
exit(-1);
}
}
printf("connected %d\n",connfd);
pid_t pid = fork();
if(pid == 0 ){
close(sockfd);
do_client(connfd); //子进程负责处理 客户请求(connfd)
}
else{
close(connfd);
continue; //父进程负责处理 连接请求(sockfd)
}
}
close(sockfd);
return 0;
}
可以直接复制粘贴使用,ip和端口采用默认,可以自行修改。本博客仅用于参考学习!