QT实现客服端和服务器之间消息和文件交互

QT学习 同时被 2 个专栏收录
4 篇文章 0 订阅
9 篇文章 1 订阅

QT实现客服端和服务器之间消息和文件交互

平台环境

龙芯务器
Qt5.6.1可视化编程的开发环境
MySQL5.5.40数据库

数据库选择与安装

将mysql-5.5.40解压至MySQL SERVER文件夹中,并重命名为mysql-5.5,接着修改my-default.ini文件中相应的信息并进行环境变量的配置,最后可通过MySQL指令“ mysql -u root -p ”进入数据库。为了保证数据库信息的隐秘性,需要为数据库添加root密码,通过MySQL指令“set password for root@localhost=password('xxxxxx')”增加root密码为xxxxxx。

交叉编译工具链GCC的安装

(1)创建相应目录存放编译器;
使用mkdir /wyj/mipsel指令创建路径为/wyj/mipsel的文件夹,该文件夹用来存放mipsel-linux-gcc编译器的所以使用的工具。
(2)将编译器安装包进行解压;
进入/wyj/mipsel文件夹,用tar jxvf mipsel-linux-gcc-4.9.3.tar.xz对交叉编译工具进行解压。
(3)设置环境变量PATH的值;
$export PATH=/wyj/mipsel/mipsel-linux-gcc-4.9.3/bin:$PATH指令设置环境变量PATH的值。
(4)测试交叉编译器是否顺利安装。
在龙芯服务器的终端中写入mipsel-linux-gcc -v,如果终端输出交叉编译器的安装版本号及其配置的有关信息,则说明交叉编译已经顺利安装。

数据库创建数据

MySQL指令create database xxx进行创建一个名为xxx的数据库,用use xxx指令指明是对xxx数据库进行操作,然后用create xxx information (id int , name text , sno text , kfh text , kno text , sdept text)指令在xxx数据库中创建名为information的数据库表,数据库表里面的信息设置为id,name,sno,kfh,kno和sdept,接着利用insert into information values(*,*,*,*,*)向information表格中添加数据,最后用net stop mysql关闭数据库,并用quit指令进行退出。

Qt的开发环境搭建

(1)下载Qt开发集成环境,解压并进入该目录下;

$ tar zxvf qt-everywhere-opensource-src-5.6.1.tar.gz
$ cd qt-everywhere-opensource-src-5.6.1/

(2)进行gmake配置使其能一次性通过,最好运行 gmake 及 gmake install,就会安装在 /usr/local/Qt-5.6.1 的目录中;

$ ./configure -qt-xcb -skip qtdeclarative
$ gmake
$ gmake install

(2)配置环境,编辑系统环境变量;
在龙芯服务器的终端命令行中输入命令行vi /etc/profile打开对应的文件,在该文件的最后需要添加如下代码:

export QTDIR=/usr/local/Qt-5.6.1
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

(3)保存之后退出,再终端执行命令source /etc/profile让配置的环境生效;
(4)验证是否安装成功。
在龙芯服务器的终端输入命令行qmake -version,如果在终端中出现如下信息,那么说明环境以及配置安装成功:

QMake version 3.0
Using Qt version 5.6.1 in /usr/local/Qt-5.6.1/lib

Web实现

TCP网络通信的流程

网络通信流程

龙芯服务器终端下服务器端和客户端运行

利用交叉编译工具链GCC生成可运行文件,指令为gcc xxx.c -o xxx
服务器端运行
客户器端运行

实现服务器端和客户端文字数据交互

服务器端建立通信

(1)在数据通信过程中需要用到两个套接字,一个是监听套接字,另一个是通信套接字

QTcpServer *tcpServer; //监听套接字
QTcpSocket *tcpSocket; //通信套接字

(2)在server.h中定义的两个套接字变量需要在server.cpp中进行初始化,将它们赋值为NULL,同时监听套接字分配空间,指定父对象

tcpServer=NULL;
tcpSocket=NULL;
tcpServer=new QTcpServer(this);

(3)当有客户端连接时就进行分配空间,使用connect函数进行连接,建立套接字进行通讯,取出建立好连接的套接字获取对方的IP地址和端口号,在窗口上显示连接成功;

connect(tcpServer,&QTcpServer::newConnection,[=]()
{
        //取出建立好连接的套接字
        tcpSocket=tcpServer->nextPendingConnection();
        QString ip=tcpSocket->peerAddress().toString();//获取对方的IP
        qint16 port=tcpSocket->peerPort();//获取对方的端口号
        QString temp=QString("[%1 %2]:成功连接").arg(ip).arg(port);
        ui->textEditRead->setText(temp);
})

(4)在UI界面选择发送按钮,右键选择转到槽函数,使得能够通过按钮实现获取编辑器的内容以及清除编辑器的内容,以此实现相应的功能;
(5)判断是否建立套接字成功,如果不是则进行return返回,并进行输出“服务端断开,请重新连接”的信息,不然则发送textEditWrite里面的内容。使用tcpsocket的disconnectFrom Host和close函数进行断开。

if(NULL == tcpSocket)
    {
        return;
    }
    tcpSocket->write("服务端断开,请重新连接");
    //主动和客户端端口连接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();

客服端建立通信

(1)在客户端中需要用到通信套接字,则首先在client.h中定义通信套接字;

QTcpSocket *tcpSocket; //通信套接字

(2)在client.h中定义的通信套接字变量需要在client.cpp中进行初始化,赋值为NULL,同时通信套接字进行分配空间,指定父对象;

tcpSocket = NULL;
//分配空间,指定父对象
tcpSocket = new QTcpSocket(this);

(3)当有服务器端与客户端连接时,使用connect函数进行连接,建立通信套接字进行通讯,并打印“成功和服务器建立好连接”的信息,获取对方发送的数据内容,并追加到编辑器中;

connect(tcpSocket, &QTcpSocket::connected,
            [=]()
            {
                ui->textEditRead->setText("成功和服务器建立好连接");
            });

(4)通过定义ip和port变量并利用lineEdit部件进行获取IP号和端口号,利用connectToHost函数主动实现与服务器建立连接;

//获取服务器IP和端口
QString ip = ui->lineEditIP->text();
qint16 port = ui->lineEditPort->text().toInt();
//主动和服务器建立连接
tcpSocket->connectToHost(QHostAddress(ip), port);

(5)在UI界面选择发送按钮,右键选择转到槽函数,获取编辑框的内容,通过write进行数据写入、read进行数据读取并进行发送,在此过程中将数据编码为Utf-8,以防出现乱码现象,最后清除编辑框的内容;

//获取编辑框内容
QString str = ui->textEditWrite->toPlainText();
//发送数据
tcpSocket->write( str.toUtf8().data() );
//清除编辑区内容
ui->textEditWrite->clear();

(6)数据传输完成后使用tcpsocket通信套接字的disconnectFrom Host和close函数主动进行断开连接。

//主动和对方断开连接
tcpSocket->write("客户端已断开");
tcpSocket->disconnectFromHost();
tcpSocket->close();

写道这太不容易了,跪了跪了。。。。。。。后面的内容包含客服端与服务器之间的文件交互以及完整代码。。。。
感谢大家持续关注!!!

  • 4
    点赞
  • 0
    评论
  • 13
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值