QT学习TCP/IP通信(一个服务端对多个客户端)

这篇具有很好参考价值的文章主要介绍了QT学习TCP/IP通信(一个服务端对多个客户端)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. QT学习TCP/IP通信(一个服务端对多个客户端)

  2. 一、服务端:

    1.创建QTcpServer对象
    2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
    3.定义一个QLis容器对象存储客户信息;
    4.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket及其ip、端口信息)
    5.QTcpsocket发送数据用成员方法write(定义一个Pushbutton,点击来触发信息发送)
    6.读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据 buffer = tcpsocket->readAll();
    二、客户端:
    1.创建QTcpSocket对象
    2.链接服务器connectToHost(QHostAddress(“ip”),端口号)
    4.QTcpsocket发送数据用成员方法write(定义一个Pushbutton,点击来触发信息发送)
    5.读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据 buffer = tcpsocket->readAll();

  3. 运行效果图片:

QT学习TCP/IP通信(一个服务端对多个客户端)
说明:本人也是Qt初学者可能有些地方存在错误,附上程序源码,希望对大家学习有帮助,欢迎相互交流讨论!

  1. 服务端程序源码:`在这里插入代码片
    server.h程序源码如下:
    #ifndef SERVER_H
    #define SERVER_H

#include
#include//监听套接字
#include//通信套接字
#include//列表类
QT_BEGIN_NAMESPACE
namespace Ui { class server; }
QT_END_NAMESPACE

class server : public QWidget
{
Q_OBJECT

public:
server(QWidget *parent = nullptr);
~server();

QList<QTcpSocket*> tcpclientlist;

private slots:
void server_New_Connect();
void socket_Read_Data();
void on_pushButton_send_clicked();
void on_pushButton_connect_clicked();

private:
Ui::server *ui;
QTcpServer *tcpserver;
QTcpSocket *tcpsocket;
};
#endif // SERVER_H

server.cpp程序源码
#include “server.h”
#include “ui_server.h”

server::server(QWidget *parent)
QWidget(parent)
, ui(new Ui::server)
{
ui->setupUi(this);
}

server::~server()
{
delete ui;
}

void server::on_pushButton_connect_clicked()
{
tcpserver=new QTcpServer(this);
if(ui->pushButton_connect->text() == tr(“连接”))
{
//从输入框获取服务端本地端口号、ip
int local_port = ui->lineEdit_port->text().toInt();
//监听指定的端口
//监听指定的端口/任意ip
tcpserver->listen(QHostAddress::Any, local_port);
connect(tcpserver,&QTcpServer::newConnection,this,&server::server_New_Connect);//连接信号槽
//修改按键文字
ui->pushButton_connect->setText(“取消连接”);
qDebug()<< “Listen succeessfully!”;
}
else
{

    ui->pushButton_connect->setText("连接");
    ui->textEdit->append("服务器端:未连接!");
}

}文章来源地址https://www.toymoban.com/news/detail-503779.html

void server::server_New_Connect()
{
//获取客户端连接
tcpsocket = tcpserver->nextPendingConnection();
//把新进来的客户端存入列表
tcpclientlist.append(tcpsocket);
//文本框中显示新的用户信息
QString ip=tcpsocket->peerAddress().toString();//获取对方的ip
quint16 port=tcpsocket->peerPort();//获取对方的端口
QString temp=QString(“[%1:%2]客户端连接成功:”).arg(ip).arg(port);
ui->textEdit->append(temp);
//接收信息
connect(tcpsocket, &QTcpSocket::readyRead, this, &server::socket_Read_Data);

}
void server::socket_Read_Data()//当有数据过来之后读数据
{
QByteArray buffer;
//利用for循环循环列表中的每一个连接进来的客户端,判断是哪一个客户端发的数据
for(int i = 0; i < tcpclientlist.count(); i++)
{
tcpsocket = tcpclientlist.at(i);
buffer = tcpsocket->readAll();
if(buffer.length()!=0) //如果检测到接收到的数据长度不为0,则代表是这个客户端发送的数据
ui->textEdit->append(buffer);
}

 buffer = tcpsocket->readAll();//读取缓冲区数据
 QString ip=tcpsocket->peerAddress().toString();//获取对方的ip
 quint16 port=tcpsocket->peerPort();//获取对方的端口
 QString temp=QString("客户端:[%1:%2]").arg(ip).arg(port);
 ui->textEdit->append(temp+":"+buffer);

}

void server::on_pushButton_send_clicked()
{
for(int i = 0; i < tcpclientlist.count(); i++)
{
tcpsocket = tcpclientlist.at(i);
if(tcpsocket==NULL)
{
return;
}
//获取发送编辑区内容
QString str=ui->textEdit_send->toPlainText();
//写入writer函数调用
tcpsocket->write(str.toUtf8().data());
ui->textEdit->append(“服务器端:”+str);
}
tcpsocket->flush();

}
`

  1. 客户端程序源码:在这里插入代码片
    socket.h程序源码:
    #ifndef SOCKET_H
    #define SOCKET_H

#include
#include//通信套接字
QT_BEGIN_NAMESPACE
namespace Ui { class socket; }
QT_END_NAMESPACE

class socket : public QWidget
{
Q_OBJECT

public:
socket(QWidget *parent = nullptr);
~socket();

private slots:
void on_pushButton_connect_clicked();

void on_pushButtonSend_clicked();
void socket_Read_Data();

private:
Ui::socket *ui;

QString userName;
QTcpSocket *tcpsocket;

};
#endif // SOCKET_H

socket.cpp程序源码:
#include “socket.h”
#include “ui_socket.h”

socket::socket(QWidget *parent)
QWidget(parent)
, ui(new Ui::socket)
{
ui->setupUi(this);
tcpsocket=new QTcpSocket(this);
connect(tcpsocket,&QTcpSocket::readyRead,this,&socket::socket_Read_Data);
}

socket::~socket()
{
delete ui;
}
void socket::socket_Read_Data()//当有数据过来之后读数据
{
QByteArray buffer;
buffer = tcpsocket->readAll();//读取缓冲区数据
ui->textEdit->append(“服务端:”+buffer);//用settext()的话会覆盖原来的消息内容,所以用append
}

void socket::on_pushButton_connect_clicked()
{
//从界面获取用户名
userName = ui->lineEditUserName->text();
//创建一个通信套接字,用来和服务器进行通信
if(ui->pushButton_connect->text() == tr(“连接”))
{
QString ip=ui->lineEdit_ip->text();//获取对方的ip
quint16 port=ui->lineEdit_port->text().toInt();//获取对方的端口
tcpsocket->connectToHost(ip,port);
connect(tcpsocket,&QTcpSocket::connected,={
ui->textEdit->append(“Server connect succeessfully!”);
});

    ui->pushButton_connect->setText("取消连接");
}
else
{
    tcpsocket->disconnectFromHost();
    tcpsocket->close();
    ui->pushButton_connect->setText("连接");
    ui->textEdit->append("客户端:未连接!");
}

}

void socket::on_pushButtonSend_clicked()
{
if(ui->lineEditSend->text() == “”)
{
return;
}
QString msg = userName + “:” + ui->lineEditSend->text();
tcpsocket->write(msg.toUtf8().data());
ui->textEdit->append(msg);
ui->lineEditSend->clear();

}

到了这里,关于QT学习TCP/IP通信(一个服务端对多个客户端)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • TCP/IP客户端和服务器端建立通信过程

    使用Qt提供的类进行基于 TCP 的套接字通信需要用到两个类: QTcpServer 类用于监听客户端连接以及和客户端建立连接,在使用之前先介绍一下这个类提供的一些常用API函数: 构造函数 给监听的套接字设置监听 listen() 函数 在代码中 通过启动监听按钮 设置监听 参数: address :

    2024年02月07日
    浏览(49)
  • C++网络通信实例(TCP/IP协议,包括服务端与客户端通信)

    创作不易 觉得有帮助请点赞关注收藏 TCP/IP是当下网络协议栈中的主流协议 TCP属于传输层的协议  可靠传输 包括经典的三次握手等等 IP协议是网络层协议 尽全力传输但不可靠 学过计算机网络的同学们对这个应该比较熟悉 以下是使用C++进行网络通信的实例  服务端 主要使用

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

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

    2024年02月08日
    浏览(67)
  • Socket实例,实现多个客户端连接同一个服务端代码&TCP网络编程 ServerSocket和Socket实现多客户端聊天

    Java socket(套接字)通常也称作\\\"套接字\\\",用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过\\\"套接字\\\"向网络发出请求或者应答网络请求。 使用socket实现多个客户端和同一客户端通讯;首先客户端连接服务端发送一条消息,服务端接收到消息后进行处理,完成后再

    2024年02月12日
    浏览(49)
  • 网络通信(13)-C#TCP服务器和客户端同时在一个进程实现的实例

    有时项目需求中需要服务器和客户端同时在一个进程实现,一边需要现场接收多个客户端的数据,一边需要将数据汇总后发送给远程服务器。下面通过实例演示此项需求。 C#TCP服务器和客户端同时在一个进程实现的实例如下: 界面设计 UI文件代码

    2024年01月22日
    浏览(51)
  • netty学习(3):SpringBoot整合netty实现多个客户端与服务器通信

    创建一个SpringBoot工程,然后创建三个子模块 整体工程目录:一个server服务(netty服务器),两个client服务(netty客户端) pom文件引入netty依赖,springboot依赖 NettySpringBootApplication NettyServiceHandler SocketInitializer NettyServer NettyStartListener application.yml Client1 NettyClientHandler SocketInitializ

    2024年02月11日
    浏览(45)
  • 基于C++和Qt封装一个简单的socket(TCP/IP)通信UI界面

            最近在学习TCP/IP和socket套接字的有关知识,了解了三次握手四次挥手,TCP协议等等一大堆知识,但纸上得来终觉浅。网络上C++代码实现socket通信的资料很多,方便学习,于是想到自己用Qt实现一个基础的具有网络通信收发功能的服务端UI软件。进入正题:        

    2024年02月08日
    浏览(40)
  • S7-1200中通过MODBUS TCP客户端在一次请求中实现从服务器读写一个或多个保持性寄存器的具体方法

    TIA博途V17中增加了MODBUS TCP客户端功能码 23,可以在一次请求作业下实现从服务器读取和写入一个或多个保持性寄存器,这样省去了轮询的编程工作量,提高了工作效率,如下图所示, 使用该指令的前提条件: • TIA Portal V17 及以上版本 • CPU 固件 V4.2 及以上版本 具体操作方

    2024年02月12日
    浏览(26)
  • tcp服务器端与多个客户端连接

    如果希望Tcp服务器端可以与多个客户端连接,可以这样写: 相关的槽函数中: 使用sender()来获取对应的QTcpSocket对象。 其实,主要就是QTcpServer进行监听: 客户端的QTcpSocket与服务器端的QTcpSocket进行通信。

    2024年04月28日
    浏览(28)
  • Tcp server是如何一个端口处理多个客户端连接的(一对一还是一对多)

    我们经常看到说,TCP 是一对一的两点服务,UDP 支持一对一、一对多、多对多的交互通信。但是使用Tcp工具通讯时,一个Tcp服务端可以连接多个Tcp客户端。所以这里的一对一和一对多是不是冲突了? 并不是 。一对一指的是Tcp连接,什么是Tcp连接,这里直接粘贴小林大神的解释

    2023年04月08日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包