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_OBJECTpublic:
explicit MainWindow(QWidget *parent = 0);~MainWindow();void r();//接受客服端的信息 进行处理private:
Ui::MainWindow *ui;QTcpServer *tcpServer;//用于连接QTcpSocket *tcpClient;//用于数据发送int serverPort=6666;//duQString 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;//用户增添
}
}
}
分享自己的代码 是想更好的检验自己代码 还有帮助他人 要源码的话 留邮箱吧