基于Qt的TCPIP网络通信实现.docx
- 文档编号:25096097
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:15
- 大小:45.03KB
基于Qt的TCPIP网络通信实现.docx
《基于Qt的TCPIP网络通信实现.docx》由会员分享,可在线阅读,更多相关《基于Qt的TCPIP网络通信实现.docx(15页珍藏版)》请在冰豆网上搜索。
基于Qt的TCPIP网络通信实现
基于tcp/ip网络通信的实现
摘要
如今随着计算机网络的不断发展,生活和工作环境的不断变化,以网络为重心的信息服务和通信服务受到各行各业的重视。
而在当今各种聊天工具竟然日趋激烈的时代,在服务,技术等各个环节都做到更好的同时,如何把现代的网络使用技术和通信技术结合起来,让世界各地的人方便交流。
本课题的最终目的是基于Qt的TCP/IP协议的进行客户端和服务端之间进行聊天。
本文中就该系统的设计思想、实现方法以及所采用的技术进行了系统的阐述,本文分为以下几个部分:
前言部分概括客户端和服务端之间通信的意义。
第一章介绍了课题实现的可行性研究。
第二章介绍了客户端和服务端具体通信的过程。
第三章是本文的核心部分,着重介绍和总结了本系统的实现思想、方法以及具体实现方案;
第四章对本聊天软件进行了总结和展望;
关键词:
QT、tcpSOCKET、客户端服务端
第一章客户端和服务端通信的可行性
1.1课题的研究目标
本课题的最终目的是通过QtCreator开发工具设计客户端和服务端的界面,进一步让客户端和服务端之间进行通信。
1.2设计思路的分析和可行性
本如软件采用服务器和客户端的形式。
服务器负责监听客户端和接收客户端发送过来的信息,并在显示在界面上。
客户端则向服务端发送信息,在本地呈现的同时,通过网络实时发往服务器。
用户在服务器器上也可以看见客户端发送的消息,并获取最新客户端发送的消息。
网络编程技术的成熟和界面设计技术使得客户端和服务端通信的设计成为可能,而且此软件同过设置IP是聊天通信更为方便。
1.3开发环境和开发技术的选用
我们选用的开发环境是QtCreator开发工具,Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面使用程序开发框架。
它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。
Qt是面向对象语言,易于扩展,并且允许组件编程。
2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。
本质上来说,Qt是一个跨平台的C++使用程序开发框架,有时又被称为C++部件工具箱。
Qt被用在KDE桌面环境、Opera、GoogleEarth、Skype、AdobePhotoshopAlbum和VirtualBox的开发中。
它是诺基亚(Nokia)的QtDevelopmentworks部门的产品。
使用Qt,只需一次性开发使用程序和用户界面,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些使用程序。
基本上,Qt同XWindow上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西,但是Qt具有下列优点:
a)优良的跨平台特性:
Qt支持下列操作系统:
MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX等等。
b)面向对象Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。
c)丰富的APIQt包括多达250个以上的C++类,还替供基于模板的collections,serialization,file,I/Odevice,directorymanagement,date/time类。
甚至还包括正则表达式的处理功能。
d)支持2D/3D图形渲染,支持OpenGLe)大量的开发文档f)XML支持
第二章基于TCP/IP协议通信的概念
2.1tcp协议
(1)TCP协议是一个基于流的协议。
在TCP之上建立的高层协议通常是基于行或者基于块的
(2)基于行的协议把数据作为一行文本进行传输,每一数据行都以一个换行符结束
(3)基于块的协议把数据作为二进制块进行传输。
每一数据块都是由一个大小字段及其包含的数据组成
2.2设计的实现
(1)Qt中的TCP通信采用的是客户端/服务器模式
(2)QTcpSocket和QTcpServer类可以用来实现TCP服务器
(3)QTcpSocket可用于实现客户端。
(4)QTcpSocket类用于创建用于TCP协议的套接字。
创建完成后可通过调用
connectToHost(IP,port)函数和服务器进行连接。
QTcpSocket通过read、write函数进行读写操作
常用信号:
Connected:
连接上时被发射
Disconnected:
连接断开时被发射
readyRead:
有数据可读时被发射
Error:
出错时被发射
服务器可通过继承QTcpServer类实现。
当声明了QTcpServer类的对象后,可通过其的listen函数对主机的端口进行监听当一个连接被建立时,newConnection()信号被发射,可以通过nextPendingConnection()函数得到最近连接到的QTcpSocket
第三章基于Qt的Tcp/IPxi协议通信的设计和实现
3.1聊天平台的设计思想
本系统采用服务器和客户端的形式。
服务器主要模拟服务器的控制端,来对客户端的各种状态进行监听。
可以通过网络向客户端发送信息,并接受客户端传来的信息,供用户参考。
客户端主要通过IP连接服务器。
客户端在显示自己状态的同时,通过网络实时将自己的状态发送到服务器端。
3.2总体设计
3.2.1服务器端的设计
服务器端界面主要如图所示,包括界面部分和控制部分。
界面执行显示功能,包括发送和清除功能。
3.2.2客户端的设计
客户端界面如图所示,采用的是界面驱动的方式。
客户端有自己的窗口,都可以单独向服务器端发送状态信息。
客户端主要包括发送和清除当前信息的功能呢,还有通过IP连接服务器的功能。
客户端的界面响使用户的操作时,可以向服务器报告自己的信息。
客户端也会将必要的信息定时报告给服务器。
3.3模拟平台的实现
3.3.1实现的技术
3.3.1.1开发环境
服务器端和客户端的开发环境均采用的是VisualStudio2010集成开发环境。
它引入了可视化程序设计方法,并具有良好的面向对象特性,开发速度快,便于程序界面设计,易于调试。
本软件用QT做为开发类库,QT做为跨平台的开发类库,通过插件可以很好地和VisualStudio2010集成。
3.3.1.2QT
服务器端和客户端的开发均采用了Qt做为开发包。
Qt是一个跨平台使用程序框架。
通过使用Qt,可以一次性开发使用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
Qt是一个开放的开发工具包,其和VisualStudio通过插件很好地结合。
Qt开发的使用可以很好地在linux下运行。
Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。
丰富的API,Qt包括多达250个以上的C++类,还提供基于模板的collections,serialization,file,I/Odevice,directorymanagement,date/time类。
甚至还包括正则表达式的处理功能。
3.3.1.3QT的UDP编程
由于本平台的通讯的数据量不是很大,而且对数据的可达性要求不是很高,所以服务器端和模拟器端的通讯采用SOCKET的UDP协议。
UDP协议编程比较简单,易于实现。
类似于MFC提供了用于SOCKET编程的CSocket类,QT中也提供了实现UDP的类QUdpSocket。
QUdpSocket的主要函数如下:
Bind:
用于绑定本机的IP地址和端口号,以便于监听传来的数据
writeDatagram:
用于向指定的IP地址和端口号发送数据
readyRead:
信号函数,用于数据的接收,可通过connect连接特定的槽函数实现报文的接收
3.3.1.4QT的UI编程
和MFC不同QT提供了专门的界面设计工具,QT设计师为界面开发提供了更多的方便。
编程人员可以通过QT设计师灵活地设计程序的界面,自由地控制界面上的各种元素。
QT设计师可以为编程人员生成和界面相关的代码,这样用户设计好界面后就不用太关心界面的问题,可以专心开发后台的代码,真正实现了前后台的分离。
QT的UI编程最大的特点就是引入了信号和槽机制。
信号和槽机制相对MFC的消息处理机制更灵活,编程人员可以自由地调配消息的发对象和收对象,甚至可以一发多收和多发一收。
信号和槽机制最重要的函数是QObject:
:
connect,负责建立信号和槽的连接关系。
通过QObject:
:
connect可以在程序运行过程中动态地配置各元素的连接关系。
3.3.1.5QT的模板类
为实现各种数据结构,QT也提供了丰富的模板类,例如QList,QVector,QLinkedList,QMap,QHash。
本软件中主要利用了QMap来实现家电的标识和家电信息的对应关系,QMap
3.3.2服务器端的实现
服务器端通过读取配置文件,将服务器端的IP地址、端口号、控制的模拟器的数量、类型、标识和端口号读入内存,并建立对于模拟器数据的UDP监听,以接收客户端的数据和向客户端发送数据。
客户端主要实现了连接服务端和想服务端大宋数据的功能。
3.3.2.1服务器控制器QHouseholdDeviceControl
服务器端实现了QHouseholdDeviceControl做为控制器,其核心是定义了QMap
3.3.2.2服务器端界面类HouseholdNetServer
namespaceUi{
classMainWindow;
}
classMainWindow:
publicQMainWindow{
Q_OBJECT
public:
MainWindow(QWidget*parent=0);
~MainWindow();
protected:
voidchangeEvent(QEvent*e);
private:
Ui:
:
MainWindow*ui;
QTcpServer*tcpServer;
QTcpSocket*tcpSocket;
privateslots:
voidon_SendButton_clicked();
voidon_ClearButton_clicked();
voidon_LinkButton_2_clicked();
voidmessage_read();
voidnew_connect();
};
界面操作响应的槽函数:
其界面设计器的外观如下:
3.3.3客户端的实现
客户端通过读取配置文件,将每个模拟器的IP地址、端口号、标识、服务器端的IP、端口号读入内存,以向服务器发送数据和接收服务器的指令。
MainWindow:
:
MainWindow(QWidget*parent):
QMainWindow(parent),
ui(newUi:
:
MainWindow)
{
ui->setupUi(this);
}
MainWindow:
:
~MainWindow()
{
deleteui;
}
voidMainWindow:
:
changeEvent(QEvent*e)
{
QMainWindow:
:
changeEvent(e);
switch(e->type()){
caseQEvent:
:
LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
voidMainWindow:
:
message_read()
{
QByteArrayqba=tcpSocket->readAll();//收取tcpSocket中的所有数据
QStringss=QVariant(qba).toString();
ui->recvtextEdit->append(ss);//把数据在控件在textEdit中显示
}
voidMainWindow:
:
on_LinkButton_clicked()
{
QStringipaddr;
intport;
ipaddr=ui->ipEdit->text();//IP地址获取
port=ui->portEdit->text().toInt();//tcp端口获取
tcpSocket=newQTcpSocket(this);//创建tcpSocket
tcpSocket->abort();
tcpSocket->connectToHost(ipaddr,port);//连接tcpSocket,
connect(tcpSocket,SIGNAL(connected()),this,SLOT(tcp_connected()));//tcp连接槽
connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(dis_connected()));//tcp断开槽
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(message_read()));//tcp数据获取槽
}
voidMainWindow:
:
tcp_connected()
{//tcp连接成功,打印连接成功信息
QStringstr="ip:
";
str.append(ui->ipEdit->text());
str.append(",port:
");
str.append(ui->portEdit->text());
str.append("connectok,pleasdsendmessage");
ui->recvtextEdit->append(str);
}
voidMainWindow:
:
dis_connected()
{//tcp连接断开,打印连接断开信息
QStringstr="tcpconnectabort.";
ui->recvtextEdit->append(str);
}
voidMainWindow:
:
on_LinkButton_2_clicked()
{//主动断开tcp连接
tcpSocket->disconnectFromHost();
}
voidMainWindow:
:
on_ClearButton_clicked()
{//清除收到的信息
ui->recvtextEdit->clear();
}
voidMainWindow:
:
on_SendButton_clicked()
{//tcp发送信息
QStringstr="";
str=ui->messageEdit->text();
tcpSocket->write(str.toLatin1());
}
3.3.3.1客户端的界面类
classMainWindow:
publicQMainWindow{
Q_OBJECT
public:
MainWindow(QWidget*parent=0);
~MainWindow();
protected:
voidchangeEvent(QEvent*e);
private:
Ui:
:
MainWindow*ui;
QTcpSocket*tcpSocket;
privateslots:
voidon_SendButton_clicked();
voidon_ClearButton_clicked();
voidon_LinkButton_2_clicked();
voidon_LinkButton_clicked();
voidmessage_read();
voidtcp_connected();
voiddis_connected();
}
3.3.4服务端的主要实现
MainWindow:
:
MainWindow(QWidget*parent):
QMainWindow(parent),
ui(newUi:
:
MainWindow)
{
ui->setupUi(this);
}
MainWindow:
:
~MainWindow()
{
deleteui;
}
voidMainWindow:
:
changeEvent(QEvent*e)
{
QMainWindow:
:
changeEvent(e);
switch(e->type()){
caseQEvent:
:
LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
voidMainWindow:
:
on_LinkButton_2_clicked()
{
ui->LinkButton_2->setDown
(1);
intport;
port=ui->portEdit->text().toInt();
tcpServer=newQTcpServer(this);
tcpServer->listen(QHostAddress:
:
Any,port);//监听任何连上端口的ip
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(new_connect()));//新连接信号触发,调用newConnect()槽函数,这个跟信号函数一样,其实你可以随便取。
}
voidMainWindow:
:
new_connect()
{
QStringstr="";
str.append("connectok,pleasdsendmessage");
ui->recvtextEdit->append(str);
tcpSocket=tcpServer->nextPendingConnection();//得到每个连进来的socket
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(message_read()));//有可读的信息,
}
voidMainWindow:
:
message_read()
{
QByteArrayqba=tcpSocket->readAll();//收取tcpSocket中的所有数据
QStringss=QVariant(qba).toString();
ui->recvtextEdit->append(ss);//把数据在控件在textEdit中显示
}
voidMainWindow:
:
on_ClearButton_clicked()
{//清除收到的信息
ui->recvtextEdit->clear();
}
voidMainWindow:
:
on_SendButton_clicked()
{//tcp发送信息
QStringstr="";
str=ui->messageEdit->text();
tcpSocket->write(str.toLatin1());
}
第四章总结和展望
5.1平台的扩展性
本平台在设计的时候就考虑了系统的扩展性,服务器端和客户端均按照面向对象的方法设计了实体类和界面的基类,基类中定义了客户端实现必备的成员变量和成员函数,在基类的基础上实现客户端的功能。
如需实现其它的客户端从基类继承,再实现其它功能即可,基本的功能不用再重复开发。
平台的通讯协议也考虑了扩展性,定义了统一的数据通讯格式,便于协议的扩展。
5.2对未来的展望
本软件基于TCP/IP协议来实现客户端和服务器的通信。
这是只是简单的客户端和服务端的通信,在此基础上,我可以添加更多更复杂的功能。
在未来的通信技术中,tcp/ip协议是必不可少的协议。
致谢
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Qt TCPIP 网络 通信 实现