您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于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来实现家电的标识和家电信息的对应关系,QMapQString,QHouseDeviceBase*m_map;3.3.2服务器端的实现服务器端通过读取配置文件,将服务器端的IP地址、端口号、控制的模拟器的数量、类型、标识和端口号读入内存,并建立对于模拟器数据的UDP监听,以接收客户端的数据和向客户端发送数据。客户端主要实现了连接服务端和想服务端大宋数据的功能。3.3.2.1服务器控制器QHouseholdDeviceControl服务器端实现了QHouseholdDeviceControl做为控制器,其核心是定义了QMapQString,QHouseDeviceBase*m_map;做为成员变量来记录收到的客户端的状态信息。3.3.2.2服务器端界面类HouseholdNetServernamespaceUi{classMainWindow;}classMainWindow:publicQMainWindow{Q_OBJECTpublic: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);//把数据在控件在textE
本文标题:基于Qt的TCPIP网络通信实现
链接地址:https://www.777doc.com/doc-2571852 .html