qt tcp/ip协议简单的用户图书管理系统(若有错误,请提醒,谢谢)

来源:互联网 发布:红蜘蛛软件年费 编辑:程序博客网 时间:2024/06/08 06:38

tcp协议的本身在百度还有别的什么资料上很多介绍我就不介绍。

我直接上代码 和一些简单的介绍了

首先数据肯定是要的 这个我就不说了 链接数据库网上一大把 ,如果不知道的,可以留言,我给你代码吧。(不要问我为啥不贴出来)

首先建立两个项目一个server端(也就是服务端) 一个是client(也就是客户端)(记得在pro里面加入 network,如果要用数据库也加上sql)

首先我们先去做server项目

这个是头文件 我基本上都标注了 不懂得话 可以留言 错误的 也可以 留言 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtNetwork>
#include <QTcpSocket>
#include <QTcpServer>
#include <QMainWindow>
#include "sql_library.h"//我自己的数据库
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
     void r();//接受客服端的信息 进行处理
private:
    Ui::MainWindow *ui;
    QTcpServer *tcpServer;//用于连接
    QTcpSocket *tcpClient;//用于数据发送
   int serverPort=6666;//du
    QString serverIP="127.0.0.1";
    QString clientMessage;
    QString serverMessage;
    QString message;
    quint16 blockSize;//存放文件大小的信息;
    QTcpSocket *clientConnection;
private slots:
    void serverSendMessage();//发送消息
    void serverReadMessage();//收获信息,阅读信息;
    void displayError(QAbstractSocket::SocketError);
    void screateServerSocket();
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
};
#endif // MAINWINDOW_H

cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{  ui->setupUi(this);
     sql_library s;
     s.sql_connect();//数据库连接
    ui->pushButton_2->setEnabled(false);//发送消息的按钮不让其操作
     connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(serverSendMessage()));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::r()//信息处理处
{
    QDateTime dt;
    dt=QDateTime::currentDateTime();
    QString time=dt.toString("yyyy:MM:dd");
    sql_library s;//数据库的实例化
    QStringList t=message.split(",");
    if(!message.isEmpty())//处理客户端信息处
    {
        QString a;
        if(t[2]=="登陆")//登陆信息处理
        {
            if(s.sql_manageverify(t[0],t[1])==1)
            {
                serverMessage="登陆成功";
               a="用户:"+t[0]+"   "+"时间:"+time+"   "+"操作:"+t[2]+"   "+"状态:"+serverMessage;
               ui->textBrowser->insertPlainText (tr("%1\n").arg (a));
            }
            else if(s.sql_manageverify(t[0],t[1])==0)
            {
                 serverMessage="密码错误";
               a="用户:"+t[0]+"   "+"时间:"+time+"   "+"操作:"+t[2]+"   "+"状态:"+serverMessage;
               ui->textBrowser->insertPlainText (tr("%1\n").arg (a));
            }
             else
            {
                 serverMessage="不存在id";
                 a="用户:"+t[0]+"   "+"时间:"+time+"   "+"操作:"+t[2]+"   "+"状态:"+serverMessage;
                ui->textBrowser->insertPlainText (tr("%1\n").arg (a));
            }
        }
      else  if(t[2]=="用户查询")
        {
            QList<QStringList> t2=s.sql_selectuser(t[0],t[1]);
            serverMessage=s.QlisttoQString1(t2);
            a="时间:"+time+"   "+"操作:"+t[2]+"   "+"状态:"+serverMessage;
            ui->textBrowser->insertPlainText (tr("%1\n").arg (a));
            qDebug()<<serverMessage;
        }
        else  if(t[2]=="用户删除")
          {
              QString t0=t[0];
              QStringList t2=t0.split("#");
              qDebug()<<t2;
              QString t1=s.sql_deleteuser(t2);
              serverMessage=t1;
              a="时间:"+time+"   "+"操作:"+t[2]+"   "+"状态:"+t1;
              ui->textBrowser->insertPlainText (tr("%1\n").arg (a));
              qDebug()<<serverMessage;
          }
        else  if(t[2]=="用户修改")
          {
              QString t0=t[0];
              QStringList t2=t0.split("#");
              qDebug()<<t2;
              QString t1=s.sql_modifyuser(t2);
              serverMessage=t1;
              a="时间:"+time+"   "+"操作:"+t[2]+"   "+"状态:"+t1;
              ui->textBrowser->insertPlainText (tr("%1\n").arg (a));
              qDebug()<<serverMessage;
          }
        else  if(t[2]=="用户增添")
          {
              QString t0=t[0];
              QStringList t2=t0.split("#");
              qDebug()<<t2;
              QString t1=s.sql_insertuser(t2);
              serverMessage=t1;
              a="时间:"+time+"   "+"操作:"+t[2]+"   "+"状态:"+t1;
              ui->textBrowser->insertPlainText (tr("%1\n").arg (a));
              qDebug()<<serverMessage;
          }
    }
}
void MainWindow::serverReadMessage()
{
    QDataStream in(clientConnection);
    in.setVersion (QDataStream::Qt_4_7);
    if(blockSize == 0)
    {
        // 判断接收的数据是否有两字节,也就是文件的大小信息
        // 如果有则保存到 blockSize 变量中,没有则返回,继续接收数据
        if(clientConnection->bytesAvailable () < (int)sizeof(quint16))
            return ;
        in >> blockSize;
    }
    if(clientConnection->bytesAvailable () < blockSize)// 如果没有得到全部的数据,则返回,继续接收数据
        return;
    in >> message;
    qDebug()<<message;
   if(!message.isEmpty())
    ui->pushButton_2->clicked();
    ui->textBrowser->insertPlainText (tr("reveived message: %1 \n").arg (message));
    blockSize = 0;
}
//服务器端发送信息
void MainWindow::serverSendMessage ()
{
    if(!clientConnection) //判断有没有实例化
        if(!(clientConnection = tcpServer->nextPendingConnection ())) //没有客户端连接
        {
            return;
        }
    if(!serverMessage.isEmpty ())
    {
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion (QDataStream::Qt_4_7);//设置版本
    out << (quint16) 0;
    out << serverMessage;
    out.device ()->seek (0);
    out << (quint16) (block.size () - sizeof(quint16));
    connect(clientConnection, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayErrorS(QAbstractSocket::SocketError)));
    clientConnection->write (block);
  }
}
void MainWindow::screateServerSocket ()
{
    clientConnection = tcpServer->nextPendingConnection ();
    blockSize = 0;//初始化
    connect (clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));//监测是否连接是否断开
    connect (clientConnection, SIGNAL(readyRead()), this, SLOT(serverReadMessage()));//监测是否有信息发过来,有,则进行处理现实
    qDebug()<<"链接成功";
}
 //服务器端错误提示
void MainWindow::displayError(QAbstractSocket::SocketError)//错误信息提示
{
  //  QMessageBox::warning (this, tr("Warnning"), clientConnection->errorString ());
    ui->textBrowser->insertPlainText (clientConnection->errorString ());
    connect (clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
    clientConnection->disconnectFromHost ();
}
void MainWindow::on_pushButton_clicked()//打开服务器
{
                        //创建新的server;
    if(ui->pushButton->text()=="打开服务器")
        {
        tcpServer=new QTcpServer(this);
        if(!tcpServer->listen(QHostAddress::Any,6666))//准许链接的IP和端口
        {
            QMessageBox::warning(this,tr("Warnning"),tcpServer->errorString());
            close();
        }
     else
            qDebug()<<"可以连接。。。。。。";
        //connect(tcpServer,SIGNAL(newConnection()),this,SLOT(updateStatus()));//建立链接发生啥事
        connect(tcpServer,SIGNAL(newConnection()),this,SLOT(screateServerSocket()));//建立链接,创捷新的套接字
        ui->pushButton->setText("关闭服务器");
    }
    else
    {
        tcpServer->close();
         ui->pushButton->setText("打开服务器");
    }
}
void MainWindow::on_pushButton_2_clicked()//发送消息
{
    r();
}
下面是客服端的代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtNetwork>
#include <QTcpSocket>
#include <QMainWindow>
#include <QTcpServer>
#include <QMessageBox>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void on_connect();//链接服务器;
    void tablewidget(int x,int y,QStringList c);//设置行数,列数,标题头
 private:
     Ui::MainWindow *ui;
     QTcpServer *tcpServer;
     QTcpSocket *tcpClient;
     int clientPort=6666;
     QString serverIP="127.0.0.1";//"115.159.189.90";
     QString clientMessage;
     QString message;
     quint16 blockSize;//存放文件大小的信息;
     QTcpSocket *clientConnection;
 private slots:
       void changeText(int rwo,int column);//获取checkbox信息
     void clientSendMessage();
     void updateStatus();
     void readMessage();
     void displayError(QAbstractSocket::SocketError);
     void createServerSocket();
     void updateClientStatusConnect();
     void updateClientStatusDisconnect();
     void on_pushButton_clicked();
     void on_pushButton_user_clicked();
     void on_tableWidget_clicked(const QModelIndex &index);
     void on_pushButton_search_clicked();
     void on_pushButton_delete_clicked();
     void on_pushButton_modify_clicked();
     void on_pushButton_insert_clicked();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QDateTime>
#include <QWidget>
int t[100];//储存check信息
int t1=0;//作为t数组的地址
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->groupBox_2->hide();//隐藏操作界面
    ui->groupBox_3->hide();//隐藏操作界面
    on_connect();//链接服务器
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(clientSendMessage()));//登陆发送信息
    connect(ui->pushButton_user,SIGNAL(clicked()),this,SLOT(clientSendMessage()));//用户信息查询请求信息
     connect(ui->pushButton_search,SIGNAL(clicked()),this,SLOT(clientSendMessage()));//信息查询请求信息
      connect(ui->pushButton_delete,SIGNAL(clicked()),this,SLOT(clientSendMessage()));//信息删除请求信息
       connect(ui->pushButton_modify,SIGNAL(clicked()),this,SLOT(clientSendMessage()));//信息修改请求信息
       connect(ui->pushButton_insert,SIGNAL(clicked()),this,SLOT(clientSendMessage()));//信息增添请求信息
     connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(changeText(int,int)));//用cell函数获取checkbox的信息
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::tablewidget(int x, int y,QStringList c)//设置tablewidget
{
    //有bug 必须点击信息让其显示在line中才能去选checkbox;
    //或者把table click中的显示在line中 注释掉
    ui->tableWidget->setColumnCount(x);//列数
    ui->tableWidget->setRowCount(y);//行数
    ui->tableWidget->setHorizontalHeaderLabels(c);
     ui->tableWidget->setEditTriggers ( QAbstractItemView::NoEditTriggers );//表格不可编辑
    ui->tableWidget->setColumnWidth(0,ui->tableWidget->size ().width ()/20);
    for(int i=0;i<y;i++)
    {
        QTableWidgetItem *check=new QTableWidgetItem;
        check->setCheckState (Qt::Unchecked);
         ui->tableWidget->setItem(i,0,check); //插入复选框
    }
}
void MainWindow::changeText(int row,int colunm)
{
    if(ui->tableWidget->item(row, colunm)->checkState()==Qt::Checked) //选中
    {
        t[t1++]=row+1;
        qDebug()<<row;
    }
    else
    {
         for(int i=0;i<=t1;i++)
         {
             if(t[i]==row+1)
             {
                  t[i]=0;
             }
         }
    }
}
void MainWindow::on_connect()//链接服务器
{
    tcpClient=new QTcpSocket(this);//创建tcpsocket
    connect(tcpClient,SIGNAL(readyRead()),this,SLOT(readMessage()));//信息阅读
    connect(tcpClient,SIGNAL(error(QAbstractSocket::SocketError)),this,
            SLOT(displayError(QAbstractSocket::SocketError)));//错误信息提示
    connect(tcpClient,SIGNAL(connected()),this,SLOT(updateClientStatusConnect()));//链接后做的updatClientstatusconnect()做的事
    connect(tcpClient,SIGNAL(disconnected()),this,SLOT(updateClientStatusDisconnect()));//断开连接做的事
            blockSize=0;
    tcpClient->abort();//刷新
    tcpClient->connectToHost(serverIP,clientPort);//链接
}
void MainWindow::clientSendMessage()//发送消息
{
    if(clientMessage.isEmpty())
    {
        //QMessageBox::warning(this,tr("Warnning"),tr("请输入发送的数据"));
        return;
    }
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out<<(quint16)0;
    out<<clientMessage;
    out.device()->seek(0);
    out<<(quint16)(block.size()-sizeof(quint16));
    tcpClient->write(block);
     qDebug()<<block;//测试;
}
void MainWindow::displayError(QAbstractSocket::SocketError)
{
    QMessageBox::warning(this,tr("Warnning"),tcpClient->errorString());
    tcpClient->close();
}
void MainWindow::updateClientStatusConnect()//链接时给的测试
{
  qDebug()<<"已经链接到服务器了";
  //ui->label_4->setText("已连接");
}
void MainWindow::updateClientStatusDisconnect()//断开链接时给的测试
{
    qDebug()<<"已经断开服务器连接";
    //ui->label_4->setText("未连接");
    tcpClient->close();
}
void MainWindow::updateStatus()
{
}
void MainWindow::readMessage()//接受消息
{
    QDataStream in(tcpClient);
    int j=0,n=0;
    in.setVersion(QDataStream::Qt_4_7);
    if(blockSize==0)
    {
        if(tcpClient->bytesAvailable()<(int)sizeof(quint16))
            return;
        in>>blockSize;
    }
    if(tcpClient->bytesAvailable()<blockSize)
        return;
    in>>message;
    blockSize=0;
   /*、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、*/
    QStringList data1=clientMessage.split(",");
     QStringList data=message.split(",");
    if(!message.isEmpty()&&data1[2]=="登陆")//
    {
         if(message=="登陆成功")
         {
              qDebug()<<"登陆成功!";
             ui->groupBox->hide();  //隐藏登陆界面
             ui->groupBox_2->show(); //显示操作界面
         }
         else{
            qDebug()<<"登陆失败";
             //QMessageBox::warning(this,tr("Warnning"),tr("登陆失败"));
            }
    }
    else if(!message.isEmpty()&&data1[2]=="用户查询")//
    {
         int j=0,n=0;
         QStringList c;
         c<<"选择"<<"编号"<<"姓名"<<"余额"<<"总借书本数"<<"已借书本书"<<"学院"<<"专业";
         tablewidget(8,data.length()/7,c);
        for(int i=0;i<data.length()/7;i++)
        {
               ui->tableWidget->setItem(i,j+1,new QTableWidgetItem(data[n])); n+=1;
               ui->tableWidget->setItem(i,j+2,new QTableWidgetItem(data[n])); n+=1;
               ui->tableWidget->setItem(i,j+3,new QTableWidgetItem(data[n])); n+=1;
               ui->tableWidget->setItem(i,j+4,new QTableWidgetItem(data[n])); n+=1;
               ui->tableWidget->setItem(i,j+5,new QTableWidgetItem(data[n])); n+=1;
               ui->tableWidget->setItem(i,j+6,new QTableWidgetItem(data[n])); n+=1;
               ui->tableWidget->setItem(i,j+7,new QTableWidgetItem(data[n])); n+=1;
        }
    }
    else if(!message.isEmpty()&&data1[2]=="用户删除")//
    {
         qDebug()<<message;
         on_pushButton_user_clicked();
    }
    else if(!message.isEmpty()&&data1[2]=="用户修改")//
    {
         qDebug()<<message;
         on_pushButton_user_clicked();
    }
}
void MainWindow::createServerSocket()
{
    clientConnection=tcpServer->nextPendingConnection();
    connect(clientConnection,SIGNAL(disconnected()),clientConnection,SLOT(deleteLater()));
}
void MainWindow::on_pushButton_clicked()//登陆
{
    if(ui->lineEdit->text()==""||ui->lineEdit_2->text()=="")
    {
        qDebug()<<"不能为空!";
      QMessageBox::warning(this,tr("警告!"),tr("id和密码不能为空!"));
    }
    else
    {
        QDateTime dt;
        dt=QDateTime::currentDateTime();
        QString time=dt.toString("yyyy:MM:dd");
        clientMessage=ui->lineEdit->text()+","+ui->lineEdit_2->text()+","+"登陆"+","+time;//账号,密码,登陆,时间
    }
}
void MainWindow::on_pushButton_user_clicked()//用户信息管理
{
    ui->tableWidget->clear();
    ui->groupBox_2->setTitle("用户信息管理");
    ui->groupBox_3->show();
    QDateTime dt;
    dt=QDateTime::currentDateTime();
    QString time=dt.toString("yyyy:MM:dd");
    QString s=NULL;
    clientMessage=s+","+s+","+"用户查询"+","+time;//用户查询
}
void MainWindow::on_tableWidget_clicked(const QModelIndex &index)
{
    int row=ui->tableWidget->currentRow();//获取当前得行数;
    ui->lineEdit_3->setText(ui->tableWidget->item(row,1)->text());//信息显示
    ui->lineEdit_4->setText(ui->tableWidget->item(row,2)->text());
    ui->lineEdit_5->setText(ui->tableWidget->item(row,3)->text());//信息显示
    ui->lineEdit_6->setText(ui->tableWidget->item(row,4)->text());
    ui->lineEdit_7->setText(ui->tableWidget->item(row,5)->text());//信息显示
}
void MainWindow::on_pushButton_search_clicked()//查询操作
{
      ui->tableWidget->clear();
    if(ui->groupBox_2->title()=="用户信息管理")
    {
        QDateTime dt;
        dt=QDateTime::currentDateTime();
        QString time=dt.toString("yyyy:MM:dd");
        clientMessage=ui->lineEdit_3->text()+","+ui->lineEdit_4->text()+","+"用户查询"+","+time;//用户查询
    }
}
void MainWindow::on_pushButton_delete_clicked()//信息删除
{
    QDateTime dt;
    dt=QDateTime::currentDateTime();
    QString time=dt.toString("yyyy:MM:dd");
    if(ui->groupBox_2->title()=="用户信息管理")
    {
        QString s=NULL;
        qDebug()<<t1;
        for(int i=0;i<t1;i++)
        {
            if(t[i]!=0)
            {
                s+="#"+ui->tableWidget->item((t[i]-1),1)->text();
                 qDebug()<<s;
            }
        }
       qDebug()<<s;
       if(t1==0)
        {
            QMessageBox::warning(this,tr("警告!"),tr("删除信息不能空!"));
            return;
        }
        else{
            clientMessage=s+","+" "+","+"用户删除"+","+time;//用户删除
        }
    }
    //ui->tableWidget->clear();
}
void MainWindow::on_pushButton_modify_clicked()//修改
{
    QDateTime dt;
    dt=QDateTime::currentDateTime();
    QString time=dt.toString("yyyy:MM:dd");
    if(ui->groupBox_2->title()=="用户信息管理")
    {
        //ui->lineEdit_3->setReadOnly(true);
        if(ui->lineEdit_3->text().isEmpty())
        {
            QMessageBox::warning(this,tr("警告!"),tr("修改信息不能空!"));
        }
        else
        {
            QString s=ui->lineEdit_3->text()+"#"+ui->lineEdit_4->text()+"#"+ui->lineEdit_5->text()+"#"+ui->lineEdit_6->text()+"#"+ui->lineEdit_7->text();
             clientMessage=s+","+" "+","+"用户修改"+","+time;//用户修改
        }
    }
}
void MainWindow::on_pushButton_insert_clicked()//增添
{
    QDateTime dt;
    dt=QDateTime::currentDateTime();
    QString time=dt.toString("yyyy:MM:dd");
    if(ui->groupBox_2->title()=="用户信息管理")
    {
        //ui->lineEdit_3->setReadOnly(true);
        if(ui->lineEdit_3->text().isEmpty())
        {
            QMessageBox::warning(this,tr("警告!"),tr("增添信息不能空!"));
        }
        else
        {
            QString s=ui->lineEdit_3->text()+"#"+ui->lineEdit_4->text()+"#"+ui->lineEdit_5->text()+"#"+ui->lineEdit_6->text()+"#"+ui->lineEdit_7->text();
             clientMessage=s+","+" "+","+"用户增添"+","+time;//用户增添
        }
    }
}

分享自己的代码 是想更好的检验自己代码 还有帮助他人 要源码的话 留邮箱吧