版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Qt编写TCP通讯程序客户端与服务器端说明:这是本人的练手之作,学习这个程序花费了大量时间,学习过程中借鉴了网友的成果。现在百忙之中将我的学习成果制作成学习教程供大家学习。同时我也希望大家都将自己的学习成果发布到网上,让大家共享。由于我是初学者,该程序肯定会有BUG和许多需要改进的地方。有需要讨论的请加我的QQ:489478088,加我时请注明:QT学习讨论。或者加入我的QQ群84998716。下载源代码后,由于不同版本的QTCreator创建的环境不同,可能无法正确运行,所以打开后,QTCreator可能会提示QTCreator发现其他环境的配置文件,问是否要载入,选择No。提示如下:这时要选择NO。如果还无法运行,那你就只好新建一个工程,把我的源文件代码全部复制到你的新建工程里,再运行。下面,开始讲解如何编写TCP测试软件:第一步,创建工程,选中QtNetwork支持,基类选择Widget。如果创建工程中没有QtNetwork选项,在工程建好后,在工程文件*.pro文件里QT+=coregui语句后面加入QT+=network否则编译将出现“QNetworkInterface:Nosuchfileo”等错误第二步,新建->文件或工程->选择QT项目->选择qt设计师界面类->选择Dialogwithoutbuttons,类名为client,完成。编辑clientui界面,右击空白部分,将对象名称改为“client”,在界面添加标签按钮等,添加完成如下:第三步,服务器地址行编辑器(LineEdit)的对象名改为clientIPlineEdit;数据发送区行编辑器(LineEdit)的对象名改为clientMessagelineEdit;端口行编辑器(LineEdit)的对象名改为clientPortlineEdit;数据显示区行编辑器(textBrowser)的对象名改为messagetextBrowser;发送按钮的对象名改为clientSendpushButton;清空按钮的对象名改为cCleanpushButton;连接按钮的对象名改为connectpushButton;断开按钮的对象名改为disconnectpushButton;Ready标签的对象名改为cStatuslabel。第四步,编辑client.h文件添加:#include<QNetworkInterface>#include<QtNetwork>2.在函数classclient:publicQDialog添加private:QList<QHostAddress>IPlist;QTcpServer*tcpServer;QTcpSocket*tcpClient;QStringclientPort;QStringserverIP;QStringclientMessage;//客户端发出的信息QStringmessage;quint16blockSize;//存放文件的大小信息QTcpSocket*clientConnection;privateslots:voidclientSendMessage();voidupdateStatus();voidreadMessage();//接收数据out<<(quint16)(block.size()-sizeof(quint16));tcpClient->write(block);if(clientMessage.contains("clientStop"))return;ui->messagetextBrowser->insertPlainText(tr("sendmessage:%1\n").arg(clientMessage));}//客户端错误提示voidclient::displayError(QAbstractSocket::SocketError){QMessageBox::warning(this,tr("Warnning"),tcpClient->errorString());tcpClient->close();ui->connectpushButton->setEnabled(true);ui->disconnectpushButton->setEnabled(false);ui->clientSendpushButton->setEnabled(false);}//客户端更新连接状态voidclient::updateClientStatusConnect(){ui->cStatuslabel->setText(tr("已连接"));ui->connectpushButton->setEnabled(false);ui->disconnectpushButton->setEnabled(true);ui->clientSendpushButton->setEnabled(true);}//客户端更新断开状态voidclient::updateClientStatusDisconnect(){ui->cStatuslabel->setText(tr("已断开"));tcpClient->close();ui->connectpushButton->setEnabled(true);ui->disconnectpushButton->setEnabled(false);ui->clientSendpushButton->setEnabled(false);}//需要自己添加的函数voidclient::updateStatus(){//暂时为空}//客户端读取信息voidclient::readMessage(){QDataStreamin(tcpClient);in.setVersion(QDataStream::Qt_4_7);if(blockSize==0){//判断接收的数据是否有两字节,也就是文件的大小信息//如果有则保存到blockSize变量中,没有则返回,继续接收数据if(tcpClient->bytesAvailable()<(int)sizeof(quint16))return;in>>blockSize;}if(tcpClient->bytesAvailable()<blockSize)//如果没有得到全部的数据,则返回,继续接收数据return;in>>message;if(message.contains("serverStop"))//如果收到是服务器停止监听的信息{tcpClient->close();ui->cStatuslabel->setText(tr("服务器断开连接"));blockSize=0;return;}ui->messagetextBrowser->insertPlainText(tr("reveivedmessage:%1\n").arg(message));blockSize=0;}//客户端创建套接字voidclient::createServerSocket(){clientConnection=tcpServer->nextPendingConnection();connect(clientConnection,SIGNAL(disconnected()),clientConnection,SLOT(deleteLater()));}这样,客户端就编写好了。第六步,编辑main.cpp文件,该文件修改后如下:#include<QtGui/QApplication>#include"widget.h"#include"client.h"intmain(intargc,char*argv[]){QApplicationa(argc,argv);Widgetw;//w.show();clientw1;w1.show();returna.exec();}可以看到效果如下,注意标题栏改成“客户端”后可能出现乱码,原因是没有添加中文支持,如何添加中文支持将在后面讲解。第七步,编辑widget.ui界面文件,添加标签和按钮,如下服务器地址行编辑器(Combobox)的对象名改为serverIPcomboBox;数据发送区行编辑器(LineEdit)的对象名改为serverMessagelineEdit;端口行编辑器(LineEdit)的对象名改为serverPortlineEdit;数据显示区行编辑器(LineEdit)的对象名改为servertextBrowser;发送按钮的对象名改为serverSendpushButton;清空按钮的对象名改为sCleanpushButton;侦听按钮的对象名改为listenpushButton;停止按钮的对象名改为stoppushButton;Ready标签的对象名改为statuslabel。第八步,编辑widget.h文件添加#include<QNetworkInterface>#include<QtNetwork>在类classWidget:publicQWidget里面添加public:explicitWidget(QWidget*parent=0);~Widget();voidgetLocalIP();//获取本机IP地址private:Ui::Widget*ui;QList<QHostAddress>IPlist;QTcpServer*tcpServer;QStringserverPort;QStringserverIP;QStringserverMessage;//服务端发出的信息QStringmessage;quint16blockSize;//存放文件的大小信息QTcpSocket*clientConnection;privateslots:voidserverSendMessage();voidon_listenpushButton_clicked();voidupdateStatus();voiddisplayErrorS(QAbstractSocket::SocketError);//显示服务端错误voidscreateServerSocket();voidon_sCleanpushButton_clicked();voidon_stoppushButton_clicked();voidserverReadMessage();第九步,编辑widget.cpp文件1.添加#include<QMessageBox>2.构造函数修改如下:Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);getLocalIP();clientConnection=NULL;connect(ui->serverSendpushButton,SIGNAL(clicked()),this,SLOT(serverSendMessage()));//ui->serverSendpushButton->setEnabled(false);ui->serverSendpushButton->setEnabled(true);ui->stoppushButton->setEnabled(false);}打开widget.ui界面,单击界面的空白处,将界面的Windowstittle的属性改为“服务器端”。在widget.ui界面分别右击“清空”、“侦听”、“停止”按钮,选择“gotoslot”,信号选择clicked().各函数修改如下://侦听按钮槽函数voidWidget::on_listenpushButton_clicked(){serverPort=ui->serverPortlineEdit->text();serverIP=ui->serverIPcomboBox->currentText();if(serverPort.isEmpty()){QMessageBox::warning(this,tr("Warnning"),tr("端口号不能为空"));return;}tcpServer=newQTcpServer(this);if(!tcpServer->listen(QHostAddress::Any,serverPort.toInt())){QMessageBox::warning(this,tr("Warnning"),tcpServer->errorString());close();}connect(tcpServer,SIGNAL(newConnection()),this,SLOT(updateStatus()));connect(tcpServer,SIGNAL(newConnection()),this,SLOT(screateServerSocket()));//有新的连接到来,则开始创建套接字ui->statuslabel->setText(tr("开始监听"));ui->listenpushButton->setEnabled(false);ui->stoppushButton->setEnabled(true);}//清空按钮槽函数voidWidget::on_sCleanpushButton_clicked(){ui->servertextBrowser->setText("");}//停止按钮槽函数voidWidget::on_stoppushButton_clicked(){ui->serverMessagelineEdit->setText(tr("serverStop"));//发送服务端停止监听信息serverSendMessage();ui->serverMessagelineEdit->setText(tr(""));tcpServer->close();ui->statuslabel->setText(tr("停止监听"));ui->listenpushButton->setEnabled(true);ui->stoppushButton->setEnabled(false);ui->serverSendpushButton->setEnabled(false);}将其余函数补充完整://服务器端读取信息voidWidget::serverReadMessage(){QDataStreamin(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;if(message.contains("clientStop"))//如果收到是客户端断开连接的信息{clientConnection->close();ui->serverSendpushButton->setEnabled(false);ui->statuslabel->setText(tr("客户端断开连接"));blockSize=0;return;}ui->servertextBrowser->insertPlainText(tr("reveivedmessage:%1\n").arg(message));blockSize=0;}//服务器端发送信息voidWidget::serverSendMessage(){if(!clientConnection)//判断有没有实例化if(!(clientConnection=tcpServer->nextPendingConnection()))//没有客户端连接{return;}serverMessage=ui->serverMessagelineEdit->text();if(serverMessage.isEmpty()){QMessageBox::warning(this,tr("Warnning"),tr("请输入发送数据"));return;}QByteArrayblock;QDataStreamout(&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);if(serverMessage.contains("serverStop"))return;ui->servertextBrowser->insertPlainText(tr("sendmessage:%1\n").arg(serverMessage));}voidWidget::getLocalIP(){IPlist=QNetworkInterface::allAddresses();foreach(QHostAddressIP,IPlist){ui->serverIPcomboBox->addItem(IP.toString());}}//需要自己添加的函数voidWidget::updateStatus(){//暂时为空}//服务器端创建套接字voidWidget::screateServerSocket(){ui->statuslabel->setText(tr("客户端已连接"));ui->serverSendpushButton->setEnabled(true);clientConnection=tcpServer->nextPendingC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年门锁行业分析报告及未来发展趋势报告
- 2026年医疗机器人行业分析报告及未来发展趋势报告
- 2026年装饰艺术玻璃行业分析报告及未来发展趋势报告
- 2026年当归行业分析报告及未来发展趋势报告
- 2026年油菜直播机行业分析报告及未来发展趋势报告
- 2026年南美白对虾养殖行业分析报告及未来发展趋势报告
- 2026年教育地产行业分析报告及未来发展趋势报告
- 2026年跨境电商零售行业分析报告及未来发展趋势报告
- 2026年双头喷枪行业分析报告及未来发展趋势报告
- 2026年轨道交通信号系统行业分析报告及未来发展趋势报告
- T/CGAS 026.2-2023瓶装液化石油气管理规范第2部分:平台建设
- 中医对高脂血症认识与防治课件
- 产品放行培训课件
- 自来水厂安全培训课件
- 秦艽的鉴定(中药鉴定技术)
- 《老年人健康管理实务》期末考试复习题库(含答案)
- 2024年山东省泰安市中考物理试卷(附真题答案)
- 23J916-1 住宅排气道(一)
- 统计学-相关与回归分析
- 2025年日历日程表含农历可打印
- 篮球 双手胸前传接球 说课
评论
0/150
提交评论