基于Qt的TCPIP网络通信实现.docx

上传人:b****4 文档编号:5986360 上传时间:2023-05-09 格式:DOCX 页数:15 大小:43.95KB
下载 相关 举报
基于Qt的TCPIP网络通信实现.docx_第1页
第1页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第2页
第2页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第3页
第3页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第4页
第4页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第5页
第5页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第6页
第6页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第7页
第7页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第8页
第8页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第9页
第9页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第10页
第10页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第11页
第11页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第12页
第12页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第13页
第13页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第14页
第14页 / 共15页
基于Qt的TCPIP网络通信实现.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于Qt的TCPIP网络通信实现.docx

《基于Qt的TCPIP网络通信实现.docx》由会员分享,可在线阅读,更多相关《基于Qt的TCPIP网络通信实现.docx(15页珍藏版)》请在冰点文库上搜索。

基于Qt的TCPIP网络通信实现.docx

基于Qt的TCPIP网络通信实现

基于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来实现家电的标识和家电信息的对应关系,QMapm_map;

3.3.2服务器端的实现

服务器端通过读取配置文件,将服务器端的IP地址、端口号、控制的模拟器的数量、类型、标识和端口号读入内存,并建立对于模拟器数据的UDP监听,以接收客户端的数据和向客户端发送数据。

客户端主要实现了连接服务端和想服务端大宋数据的功能。

3.3.2.1服务器控制器QHouseholdDeviceControl

服务器端实现了QHouseholdDeviceControl做为控制器,其核心是定义了QMapm_map;做为成员变量来记录收到的客户端的状态信息。

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协议是必不可少的协议。

致谢

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2