QT TCP网络编程——服务端的实现

这篇具有很好参考价值的文章主要介绍了QT TCP网络编程——服务端的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT TCP网络编程——服务端的实现


温馨提示:初来乍到,请多关照,文章如有不足,还请不吝赐教。本程序是仿照通讯助手(NetAssist.exe)进行界面设计以及基本功能实现的,主要实现的功能有监听服务器端口、发送、接收数据。使用到的工具及编程语言为:visual studio 2015、QT、C++,其中代码仅供参考

前言


提示:以下是本篇文章正文内容,下面案例可供参考
视频演示:

一、QT TCP服务器

在开始编写代码之前,首先要知道QT网络编程需要用到两个类:
1、QTcpServer:主要是实现服务器的端口监听。
2、QTcpSocket:套接字,消息的接收和发送。
以上两个类是实现QT TCP服务器必不可少的,这与QT TCP客户端用的只有QTcpSocket类,后面的文章会讲到,此处不做过多赘述。

二、编程步骤

1.引入主要的库

#include “qtcpserver.h”
#include “qtcpsocket.h”
#include “qnetworkinterface.h”


2.界面的设计

主要使用的是QT,拉取控件实现的:
QT TCP网络编程——服务端的实现


3.具体实现步骤

3.1自动获取本机地址

如果是简单的使用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);

3.1 监听端口

开启服务器端口服务,建立QTcpServer对象,使用listen()方法就可以开启指定的端口。

impl->tcpServer->listen(ipAddress, port)//监听指定IP 端口

服务器监听成功后,客户即可通过指定的IP和端口连接到该服务器。服务器通过接收到newConnction()信号来判断是否有客户连接。

connect(impl->tcpServer, SIGNAL(newConnection()), this,SLOT(dealNewClientConnect()));

3.2 客户连接

由于连接到服务器的客户不止一个,且服务器在发送数据时,可以进行群发,也可以进行单发,所以在客户连接到服务器时,一定要先存储好每个可户端。这里使用的是构造一个结构体数据来存储。

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()));

3.3 读写数据

服务器的接收和发送数据,主要是QTcpSocket提供的。
1.读:

QByteArray arrs = impl->tcpSocketLists.at(i).tcpClients->readAll();

2.写:

impl->tcpSocketLists.at(i).tcpClients->write(sendData.toLatin1());

3.4 客户断开连接

客户端自动断开连接时,会产生disconnected信号。这里主要是为了重新渲染连接到服务器的客户端数量。

4 程序代码链接

百度网盘链接分享

提取码:6565


总结

提示:这里主要是自己写这个程序过程的感悟,读者可看可不看:

其实QT为TCP网络编程提供了现成的类,只需要调用即可。主要还是界面功能的一些实现,需要好好去琢磨。好了,QT服务器的实现就介绍在这了,有什么问题或想法,请私信我哦,下期再见!拜谢!文章来源地址https://www.toymoban.com/news/detail-441620.html

到了这里,关于QT TCP网络编程——服务端的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络编程】TCP流套接字编程(TCP实现回显服务器)

    Socket(既能给客户端使用,也能给服务器使用) 构造方法 基本方法: ServerSocket(只能给服务器使用) 构造方法: 基本方法: 客户端代码示例: 服务器代码示例: 运行结果: 代码执行流程: 服务器启动,阻塞在accept,等待客户端建立连接. 客户端启动.这里的new操作会触发和服务器之间建立连

    2024年04月25日
    浏览(65)
  • 【网络编程】实现UDP/TCP客户端、服务器

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、UDP 1、Linux客户端、服务器 1.1udpServer.hpp 1.2udpServer.cc 1.3udpClient.hpp 1.4udpClient.cc 1.5onlineUser.hpp 2、Windows客户端 二、T

    2024年02月06日
    浏览(56)
  • C#实现简单TCP服务器和客户端网络编程

    在C#中进行网络编程涉及许多类和命名空间,用于创建和管理网络连接、传输数据等。下面是一些主要涉及的类和命名空间: System.Net 命名空间: 这个命名空间提供了大部分网络编程所需的类,包括: IPAddress :用于表示IP地址。 IPEndPoint :表示IP地址和端口号的组合。 Socke

    2024年02月11日
    浏览(60)
  • 【网络编程】实现一个简单多线程版本TCP服务器(附源码)

    accept 函数是在服务器端用于接受客户端连接请求的函数,它在监听套接字上等待客户端的连接,并在有新的连接请求到来时创建一个新的套接字用于与该客户端通信。 下面是 accept 函数的详细介绍以及各个参数的意义: sockfd: 是服务器监听套接字的文件描述符,通常是使用

    2024年02月13日
    浏览(49)
  • 【计算机网络】网络编程套接字&UDP服务器客户端的简单模拟

    需要云服务器等云产品来学习Linux的同学可以移步/–腾讯云–/官网,轻量型云服务器低至112元/年,优惠多多。(联系我有折扣哦) 每台主机都有自己的IP地址,当数据在进行通信的时候,除了要发送的数据外,在报头里面还要包含发送方的IP和接收方的IP,这里发送方的IP就

    2024年02月20日
    浏览(59)
  • python网络编程:通过socket实现TCP客户端和服务端

    目录 写在开头 socket服务端(基础) socket客户端(基础) 服务端实现(可连接多个客户端)  客户端实现 数据收发效果   近期可能会用python实现一些网络安全工具,涉及到许多关于网络的知识,逃不过的就是最基本的socket。本文将介绍如何通过python自带的socket库实现TCP客户

    2024年03月21日
    浏览(53)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(83)
  • QT网络编程之TCP

    TCP 编程需要用到俩个类: QTcpServer 和 QTcpSocket。

    2024年02月13日
    浏览(33)
  • [Linux] 网络编程 - 初见TCP套接字编程: 实现简单的单进程、多进程、多线程、线程池tcp服务器

    网络的上一篇文章, 我们介绍了网络变成的一些重要的概念, 以及 UDP套接字的编程演示. 还实现了一个简单更简陋的UDP公共聊天室. [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现…

    2024年02月16日
    浏览(64)
  • 【网络编程】——基于TCP协议实现回显服务器及客户端

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 TCP提供的API主要有两个类 Socket ( 既会给服务器使用也会给客

    2024年02月03日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包