赞
踩
tcp通信的步骤:十几行代码实现TCP通信。
QT的tcp通信机制:
首先创建TCP的服务器和客户端,如图所示:
设计一个普通界面,并且对这个普通界面进行布局。
之后在代码区对代码进行填充:
1、首先添加类,否则头文件报错,无法进行编译。
首先在server.h中添加头文件。
#include <QTcpServer>
#include <QTcpSocket>
并且在类中定义新的套接字。
private:
Ui::Server *ui;
QTcpServer* server;//监听的套接字
QTcpSocket* conn;//通信的套接字
在server.cpp中添加如下代码。
Server::Server(QWidget *parent) : QWidget(parent) , ui(new Ui::Server) { ui->setupUi(this); //初始化 ui->sIP->setText("127.0.0.1");//设置IP窗口初始化显示的IP地址 ui->sPort->setText("9999");//设置初始化显示的端口号 //实例 init server = new QTcpServer(this); //监听 server->listen(QHostAddress(ui->sIP->text()),ui->sPort->text().toInt()); //新的链接 connect(server,&QTcpServer::newConnection,this,[=]() { //接受客户端的套接字对象 //sock_addr 结构体 == 类 QTcpScoket conn = server->nextPendingConnection(); //发送数据 给客户端 conn->write("小弟你好"); ui->record->append("有新的连接..."); //保证conn是一个有效的对象 connect(conn,&QTcpSocket::readyRead,this,[=]() { //接收数据 QByteArray array = conn->readAll(); ui->record->append(array); }); }); //发送 connect(ui->send,&QPushButton::clicked,this,[=]() { //发送数据 conn->write(ui->msg->toPlainText().toUtf8());//转换格式成为utf8 ui->record->append("Me Say" + ui->msg->toPlainText());//添加新内容 ui->msg->clear(); }); }
创建完成之后,有如下界面显示。
下一步创建客户端,首先在client.h添加头文件。
#include <QWidget>
#include <QTcpSocket>
并且在类中定义新的套接字。
private:
Ui::Client *ui;
QTcpSocket *client;
在client.cpp中添加如下的代码。
#include <QHostAddress> Client::Client(QWidget *parent) : QWidget(parent), ui(new Ui::Client) { ui->setupUi(this); ui->sIP->setText("127.0.0.1");//设置初始的IP地址 ui->sPort->setText("9999");//设置初始的端口号 //init client = new QTcpSocket(this); //连接服务器,参数包括主机的地址,主机的端口号。 client->connectToHost(QHostAddress(ui->sIP->text()),ui->sPort->text().toInt()); //接收数据 connect(client,&QTcpSocket::readyRead,this,[=]() { QByteArray array = client->readAll();//返回值是一种QByteArray类型。 ui->record->append(array);//把返回读取到的内容都添加到record中。 connect(ui->send,&QPushButton::clicked,this,[=]()//槽函数,按键发送消息 { client->write(ui->msg->toPlainText().toUtf8()); ui->record->append("ME say:" + ui->msg->toPlainText());//record后面添加新发送的内容。 }); }); }
通信原理:
文件类
1 、 QFile file(name)
file.setFileName
readALL()/readLine; --atEnd()==true(末尾)。
int size = write(char* buf,int size)
2、 QTextStream ts(&f);
需要和文件设备一起使用,IO设备,或者使用ts.setDevice(&f);
readAll()/readLine()
ts<<“abcdef”;箭头朝向就是目标。把abcdef写入ts。
ts>>str;把ts写入str。
3、QDataStream ds(&f);
使用操作符读取文件。
读文件:
ds>>str>>number;
写文件:
char *str = “string”;
ds<<Qstring(“string”)<<1234;//隐式转换成QString
读文件:
QString str;
int number;
ds>> str >>number;
Qpixmap pix;
QByteArray array;
QDataStream ds(&array,QIODevice::WriteOnly);
ds<<pix;
5.TCP:包含的模块qmak += network
服务器端:
1.listen:QtcpServer --不是IO设备 父类是QObject //只是监听 ,不需要发送和接收数据
2.通信:QtcpSocket --父类是IO设备 --QIODevice
1>. 服务器端 等待连接
监听:server.listen(Any,port);
2>.newConnection();
1.接收请求 – 拿到client端的套接字的对象的地址
conn = server.nextPendingConnection(); //指针初始化
3>. write –
4>.read)—— readyRead
客户端:QTcpSocket cl;
cl.connectToHost(IP,port);
6.UDP类:QUdpSocket --IO设备
1.发送数据:s.writedatagram(data,对方的IP,对方的Port);
2.readyRead()
int size = s.pendingDatagramSize();
QByteArray array(size,0);
s.readDatagram(buf,size);
3.要接收数据:绑定一个端口号(本地)。
4.广播 : 255.255.255.255
5.组播:。。。
另一方需要接收组播消息:加入到组播地址。
起初创建的界面,模拟多线程。
添加如下代码:
mytimer = new QTimer(this); connect(mytimer,&QTimer::timeout,this,[=]()
{
static int num =0;
ui->lcdNumber->display(num++);
});
void MyWdiget::on_begin_clicked()
{
if(mytimer->isActive() == true)
{
return;
}
//启动定时器
mytimer->start(500); //ms
//复杂的操作
QThread::sleep(5);//线程睡眠5ms
//关闭定时器
mytimer->stop();
qDebug()<<"定时器已经停止了";
}
之后添加一个新的类,改变继承的参数。
首先添加sql模块。
添加头文件。
#include <QSqlDatabase>
#include <QDebug>
在widget.cpp添加新的数据库。
//添加一个数据库
QSqlDatabase db = QSqlDatabase::addDatabase("驱动名");
qDebug()<<QSqlDatabase::drivers();
运行结果显示。
第一个是嵌入式的文本文件。
第一种风格的批量处理。
// 设置数据库 db.setHostName("localhost");//设置主机的IP db.setUserName("root");//登录mysql数据库的用户名 db.setPassword("1234");//登录mysql数据库的密码 db.setDatabaseName("test");//登录哪一个数据库 //打开数据库 if(db.open()==false) { QMessageBox::warning(this,"warning",db.lastError().text()); } //增删查改 //添加一条记录 QSqlQuery query; // QString sql = "insert into people(name,age) values('张三丰',123)"; // query.exec(sql);//执行 //预处理 // ?是 通配符 odbc风格的通配符 query.prepare("insert into people(name,age) values(?,?)"); //添加绑定数据 QVariantList namelist;//一个链表 namelist << "aa"<<"bb"<<"cc"; query.addBindValue(namelist); QVariantList agelist;//一个链表 namelist << 12<<13<<14; query.addBindValue(agelist); //执行批处理 query.execBatch();
第二种风格的批量处理。
//oracle 风格的通配符
//方式: +自定义的名字
query.prepare("insert into people(name,age) values(:name,:age)");
//添加绑定数据
QVariantList namelist;//一个链表
namelist << "aa"<<"bb"<<"cc";
query.bindValue(":name",namelist);
QVariantList agelist;//一个链表
namelist << 12<<13<<14;
query.bindValue(":age",agelist);
//执行批处理
query.execBatch();
数据库的查询
剩下的操作就是sql语句了。
//数据查询
query.exec("select * from people");//指针指向首地址
//如果有值就查出来记录了,false是个空表
while(query.next() == false)//遍历每一条记录
{
qDebug()<<query.value(0).toInt() //0 表示 第一个字段的索引值
<<query.value("name").toString().toUtf8().data();
}
//1.实例化 model
model = new QSqlTableModel(this);
//2.将模型设置到模型中--前提是你已经打开了数据库
ui->tableView->setModel(model);
//3.给model设置数据库表
model->setTable("");
//4.查询表.//可以把表显示到界面上。
model->select();
//1.实例化 model
model = new QSqlTableModel(this);
//2.将模型设置到模型中--前提是你已经打开了数据库
ui->tableView->setModel(model);
//3.给model设置数据库表
model->setTable("");
//4.查询表.//可以把表显示到界面上。
model->select();
//5.设置表头
model->setHeaderData(0,Qt::Horizontal,"编号");
//6.设置提交模式,程序刷新不会更改
model->setEditStrategy(QSqlTableModel::OnManualSubmit);//用户提交操作
几个不同按钮的操作
提交
//设置提交按钮
model->submitAll();
撤销
//设置撤销按钮
model->revertAll();
model->submit();//撤销完成之后,再提交一边,作用是更新数据库。
查询
QString name = ui->lineEdit->text();//查询人的名字
//设置过滤条件
QString sql = QString("name = %1").arg(name);
model->setFilter(sql);
//重新查询
model->select();
界面设计如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。