-
QT学习TCP/IP通信(一个服务端对多个客户端)
-
一、服务端:
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(); -
运行效果图片:
说明:本人也是Qt初学者可能有些地方存在错误,附上程序源码,希望对大家学习有帮助,欢迎相互交流讨论!
- 服务端程序源码:`在这里插入代码片
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();
}
`
- 客户端程序源码:
在这里插入代码片
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();文章来源:https://www.toymoban.com/news/detail-503779.html
}
到了这里,关于QT学习TCP/IP通信(一个服务端对多个客户端)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!