基于Qt的TCPIP网络通信实现.doc_第1页
基于Qt的TCPIP网络通信实现.doc_第2页
基于Qt的TCPIP网络通信实现.doc_第3页
基于Qt的TCPIP网络通信实现.doc_第4页
基于Qt的TCPIP网络通信实现.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于tcp/ip网络通信的实现摘 要如今随着计算机网络的不断发展,生活和工作环境的不断变化,以网络为重心的信息服务和通信服务受到各行各业的重视。而在当今各种聊天工具竟然日趋激烈的时代,在服务,技术等各个环节都做到更好的同时,如何把现代的网络应用技术与通信技术结合起来,让世界各地的人方便交流。本课题的最终目的是基于Qt的TCP/IP协议的进行客户端和服务端之间进行聊天。本文中就该系统的设计思想、实现方法以及所采用的技术进行了系统的阐述,本文分为以下几个部分:前言部分概括客户端和服务端之间通信的意义。第一章介绍了课题实现的可行性研究 。第二章介绍了客户端和服务端具体通信的过程。第三章是本文的核心部分,着重介绍和总结了本系统的实现思想、方法以及具体实现方案;第四章对本聊天软件进行了总结和展望;关键词:QT、tcp SOCKET、客户端 服务端第一章 客户端与服务端通信的可行性1.1 课题的研究目标本课题的最终目的是通过Qt Creator开发工具设计客户端和服务端的界面,进一步让客户端和服务端之间进行通信。1.2 设计思路的分析和可行性本如软件采用服务器和客户端的形式。服务器负责监听客户端和接收客户端发送过来的信息,并在显示在界面上。客户端则向服务端发送信息,在本地呈现的同时,通过网络实时发往服务器。用户在服务器器上也可以看见客户端发送的消息,并获取最新客户端发送的消息。网络编程技术的成熟和界面设计技术使得客户端与服务端通信的设计成为可能,而且此软件同过设置IP是聊天通信更为方便。1.3 开发环境和开发技术的选用我们选用的开发环境是Qt Creator开发工具,Qt是一个1991年由奇趣科技开发的跨平台C+图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。Qt是面向对象语言,易于扩展,并且允许组件编程。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。本质上来说, Qt是一个跨平台的C+应用程序开发框架,有时又被称为C+部件工具箱。Qt被用在KDE桌面环境、Opera、Google Earth、Skype、Adobe Photoshop Album和VirtualBox的开发中。它是诺基亚(Nokia)的Qt Development works 部门的产品。使用 Qt ,只需一次性开发应用程序和用户界面,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。 基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但是 Qt 具有下列优点: a) 优良的跨平台特性: Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。 b) 面向对象 Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。 c) 丰富的 API Qt 包括多达 250 个以上的 C+ 类,还替供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。甚至还包括正则表达式的处理 功能。 d) 支持 2D/3D 图形渲染,支持 OpenGL e) 大量的开发文档 f) XML 支持第二章 基于TCP/IP协议通信的概念2.1 tcp协议(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开发环境服务器端和客户端的开发环境均采用的是Visual Studio 2010集成开发环境。它引入了可视化程序设计方法,并具有良好的面向对象特性,开发速度快,便于程序界面设计,易于调试。本软件用QT做为开发类库,QT做为跨平台的开发类库,通过插件可以很好地与Visual Studio 2010集成。3.3.1.2 QT服务器端和客户端的开发均采用了Qt做为开发包。Qt是一个跨平台应用程序框架。通过使用Qt,可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。Qt是一个开放的开发工具包,其与Visual Studio通过插件很好地结合。Qt开发的应用可以很好地在linux下运行。Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。丰富的 API,Qt 包括多达 250 个以上的 C+ 类,还提供基于模板的 collections, serialization, file, I/O device, directory management, 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 m_map; 3.3.2 服务器端的实现服务器端通过读取配置文件,将服务器端的IP地址、端口号、控制的模拟器的数量、类型、标识和端口号读入内存,并建立对于模拟器数据的UDP监听,以接收客户端的数据和向客户端发送数据。客户端主要实现了连接服务端和想服务端大宋数据的功能。3.3.2.1 服务器控制器QHouseholdDeviceControl服务器端实现了QHouseholdDeviceControl做为控制器,其核心是定义了QMap m_map; 做为成员变量来记录收到的客户端的状态信息。3.3.2.2 服务器端界面类HouseholdNetServernamespace Ui class MainWindow;class MainWindow : public QMainWindow Q_OBJECTpublic: MainWindow(QWidget *parent = 0); MainWindow();protected: void changeEvent(QEvent *e);private: Ui:MainWindow *ui; QTcpServer *tcpServer; QTcpSocket *tcpSocket;private slots: void on_SendButton_clicked(); void on_ClearButton_clicked(); void on_LinkButton_2_clicked(); void message_read(); void new_connect();界面操作响应的槽函数:其界面设计器的外观如下:3.3.3客户端的实现客户端通过读取配置文件,将每个模拟器的IP地址、端口号、标识、服务器端的IP、端口号读入内存,以向服务器发送数据和接收服务器的指令。MainWindow:MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui:MainWindow) ui-setupUi(this);MainWindow:MainWindow() delete ui;void MainWindow:changeEvent(QEvent *e) QMainWindow:changeEvent(e); switch (e-type() case QEvent:LanguageChange: ui-retranslateUi(this); break; default: break; void MainWindow:message_read() QByteArray qba = tcpSocket-readAll(); /收取tcpSocket中的所有数据 QString ss=QVariant(qba).toString(); ui-recvtextEdit-append(ss); /把数据在控件在textEdit中显示void MainWindow:on_LinkButton_clicked() QString ipaddr; int port; ipaddr = ui-ipEdit-text(); /IP地址获取 port = ui-portEdit-text().toInt(); /tcp端口获取 tcpSocket = new QTcpSocket(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数据获取槽void MainWindow:tcp_connected() /tcp连接成功,打印连接成功信息 QString str=ip:; str.append(ui-ipEdit-text(); str.append(,port:); str.append(ui-portEdit-text(); str.append( connect ok,pleasd send message); ui-recvtextEdit-append(str);void MainWindow:dis_connected() /tcp连接断开,打印连接断开信息 QString str=tcp connect abort.; ui-recvtextEdit-append(str);void MainWindow:on_LinkButton_2_clicked() /主动断开tcp连接 tcpSocket-disconnectFromHost();void MainWindow:on_ClearButton_clicked() /清除收到的信息 ui-recvtextEdit-clear();void MainWindow:on_SendButton_clicked() /tcp发送信息 QString str=; str = ui-messageEdit-text(); tcpSocket-write(str.toLatin1();3.3.3.1 客户端的界面类class MainWindow : public QMainWindow Q_OBJECTpublic: MainWindow(QWidget *parent = 0); MainWindow();protected: void changeEvent(QEvent *e);private: Ui:MainWindow *ui; QTcpSocket *tcpSocket;private slots: void on_SendButton_clicked(); void on_ClearButton_clicked(); void on_LinkButton_2_clicked(); void on_LinkButton_clicked(); void message_read(); void tcp_connected(); void dis_connected();3.3.4 服务端的主要实现MainWindow:MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui:MainWindow) ui-setupUi(this);MainWindow:MainWindow() delete ui;void MainWindow:changeEvent(QEvent *e) QMainWindow:changeEvent(e); switch (e-type() case QEvent:LanguageChange: ui-retranslateUi(this); break; default: break; void MainWindow:on_LinkButton_2_clicked() ui-LinkButton_2-setDown(1); int port; port = ui-portEdit-text().toInt(); tcpServer = new QTcpServer(this); tcpServer-listen(QHostAddress:Any,port); /监听任何连上端口的ip connect(tcpServer,SIGNAL(newConnection(),this,SLOT(new_connect(); /新连接信号触发,调用newConnect()槽函数,这个跟信号函数一样,其实你可以随便取。void MainWindow:new_connect() QString str=; str.append(connect ok,pleasd send message); ui-rec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论