赞
踩
温馨提示:初来乍到,请多关照,文章如有不足,还请不吝赐教。本程序是仿照通讯助手(NetAssist.exe)进行界面设计以及基本功能实现的,主要实现的功能有监听服务器端口、发送、接收数据。使用到的工具及编程语言为:visual studio 2015、QT、C++,其中代码仅供参考
提示:以下是本篇文章正文内容,下面案例可供参考
视频演示:
在开始编写代码之前,首先要知道QT网络编程需要用到两个类:
1、QTcpServer:主要是实现服务器的端口监听。
2、QTcpSocket:套接字,消息的接收和发送。
以上两个类是实现QT TCP服务器必不可少的,这与QT TCP客户端用的只有QTcpSocket类,后面的文章会讲到,此处不做过多赘述。
#include “qtcpserver.h”
#include “qtcpsocket.h”
#include “qnetworkinterface.h”
主要使用的是QT,拉取控件实现的:
如果是简单的使用QNetworkInterface::allAddresses()
,获取到的IP集合中包含fff之类的数据,所以就需要进行筛选。筛选本地地址的主要思路如下:
1.IP地址的组成主要是数字;
2.IP地址的范围主要是0.0.0.0~255.255.255.255之间(不细分);
3.IP字段都包含“.”;
4.IP字段以“.”划分,有四段;
根据上面的思路,就可以在程序加载后,将本地合法的IP地址渲染到QComboBox中。
代码如下(示例):
QStringList strList; //得到本地IP的一个集合 QList<QHostAddress> ipList = QNetworkInterface::allAddresses(); //循环取出 for (int i = 0; i < ipList.size(); i++) { QString ipStr = ipList[i].toString(); //ip地址在7~15之间 if (ipStr.size() < 7 || ipStr.size() > 15) { continue; } QStringList ipStrList = ipStr.split("."); //ip以.隔开 分为4组 if (ipStrList.size() != 4) { continue; } for (int j = 0; j < ipStrList.size(); j++) { int ipData = ipStrList[j].toInt(); try { //必须是数字 并且在0~255 if (ipData < 0 || ipData > 255) { break; } } catch (const std::exception&) { break; } } strList.append(ipStr); } impl->ui.ipAddressBox->addItems(strList);
开启服务器端口服务,建立QTcpServer对象,使用listen()方法就可以开启指定的端口。
impl->tcpServer->listen(ipAddress, port)//监听指定IP 端口
服务器监听成功后,客户即可通过指定的IP和端口连接到该服务器。服务器通过接收到newConnction()信号来判断是否有客户连接。
connect(impl->tcpServer, SIGNAL(newConnection()), this,SLOT(dealNewClientConnect()));
由于连接到服务器的客户不止一个,且服务器在发送数据时,可以进行群发,也可以进行单发,所以在客户连接到服务器时,一定要先存储好每个可户端。这里使用的是构造一个结构体数据来存储。
typedef struct {
QString clientIpAddress;
quint16 clientPort;
QTcpServer* sockServers;
QTcpSocket* tcpClients;
}ClientInfos;
有了结构体后,当有新的客户连接到服务器时,将该客户端的IP即端口存储下来,代码如下:
ClientInfos info; //有新的连接 impl->tcpSocket = impl->tcpServer->nextPendingConnection(); info.tcpClients = impl->tcpSocket; //获取连接到服务器的客户IP及地址 quint16 port = impl->tcpSocket->peerPort(); info.clientPort = port; //IP QHostAddress address = impl->tcpSocket->peerAddress(); QString ip = address.toString(); info.clientIpAddress = ip; //添加到结构体 impl->tcpSocketLists.append(info); //更新combox updateConnectBox(); impl->ui.receiveEdit->append(QString("[%1]# IP:%2,PORT:%3已连接").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(ip).arg(port)+"<br/>"); //当客户有数据过来时,会产生readyRead信号 connect(impl->tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveData())); //当客户自动断开连接时,会产生disconnected信号 connect(impl->tcpSocket, SIGNAL(disconnected()), this, SLOT(dealDisconnected()));
服务器的接收和发送数据,主要是QTcpSocket提供的。
1.读:
QByteArray arrs = impl->tcpSocketLists.at(i).tcpClients->readAll();
2.写:
impl->tcpSocketLists.at(i).tcpClients->write(sendData.toLatin1());
客户端自动断开连接时,会产生disconnected信号。这里主要是为了重新渲染连接到服务器的客户端数量。
提取码:6565
提示:这里主要是自己写这个程序过程的感悟,读者可看可不看:
其实QT为TCP网络编程提供了现成的类,只需要调用即可。主要还是界面功能的一些实现,需要好好去琢磨。好了,QT服务器的实现就介绍在这了,有什么问题或想法,请私信我哦,下期再见!拜谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。