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初学者可能有些地方存在错误,附上程序源码,希望对大家学习有帮助,欢迎相互交流讨论!

  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("服务器端:未连接!");
}

}

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

}

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt一个跨平台的C++应用程序框架,它提供了丰富的库和工具来帮助开者创建各种类型的应用程序,包括网络通信应用。 在Qt中实现TCP服务端客户端通信非常简单。首先,我们需要创建一个QTcpServer对象来作为服务端,该对象负责监听客户端连接请求。接下来,我们需要为QTcpServer对象绑定一个IP地址和端口号,以便客户端能够连接到该地址和端口。当有新的客户端连接时,QTcpServer对象会出newConnection()信号。 在服务端的槽函中,我们可以使用QTcpServer的nextPendingConnection()函获取新连接QTcpSocket对象,该对象用于和客户端进行通信。我们可以在该对象上送和接收数据,以实现服务端客户端之间的数据交互。 接下来,我们需要创建一个QTcpSocket对象作为客户端,该对象负责和服务端建立连接。我们需要使用connectToHost()函来指定要连接服务端IP地址和端口号。一旦连接成功,QTcpSocket对象会出connected()信号。 在客户端的槽函中,我们可以使用QTcpSocket对象送和接收数据。我们可以使用write()函数据,使用readyRead()信号和read()函接收数据。 通过这种方式,我们可以在服务端客户端之间进行双向的数据通信服务端可以同时接受多个客户端连接,每个客户端都可以和服务端进行独立的数据交互。 总的来说,使用Qt实现TCP服务端客户端通信非常方便。通过使用QTcpServer和QTcpSocket类,我们可以轻松地建立连接送和接收数据。这种通信方式可以应用于多种场景,如实时聊天、远程控制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值