QT实现TCP服务器客户端搭建的代码,现象
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectButton_clicked();//自定义处理connected信号的槽函数的声明void connected_slot();//自定义处理readyRead信号的槽函数的声明void readyRead_slot();//自定义处理disconnected信号的槽函数的声明void disconnected_slot();void on_sendButton_clicked();void on_disconnectButton_clicked();private:Ui::Widget *ui;//定义客户端指针QTcpSocket *socket;//定义字符串接受用户QString userName;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给客户端指针实例化对象socket=new QTcpSocket(this);//此时,已经向服务器发送连接请求了,如果成功连接服务器,那么该客户端就会自动发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理逻辑//由于只需要连接一次,所以将连接写在构造函数中connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);//如果服务器向客户端发来消息,那么该客户端就会自动发射一个readyRead信号//我们可以将该进行连接到自定义的槽函数中处理相关逻辑connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次即可,所以放在构造函数中进行connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器对应的槽函数
void Widget::on_connectButton_clicked()
{//获取ui界面上的相关信息userName=ui->nameEdit->text(); //获取用户名QString ip=ui->ipEdit->text(); //主机地址quint16 port=ui->portEdit->text().toUInt(); //端口号//函数原型:virtual void connectToHost(const QHostAddress &address, quint16 port);//功能:将客户端连接到给定的服务器//参数1:服务器的主机地址//参数2:端口号//返回值:无socket->connectToHost(ip,port);//此时,已经向服务器发送连接请求了,如果成功连接服务器,那么该客户端就会自动发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理逻辑//由于只需要连接一次,所以将连接写在构造函数中
}
//处理connected信号的槽函数的定义
void Widget::connected_slot()
{QMessageBox::information(this,"成功","你已经成功进入聊天室");//QString msg=userName +":进入聊天室";socket->write(msg.toLocal8Bit());}
//处理readyRead信号的槽函数的定义
void Widget::readyRead_slot()
{//读取套接字中的信息QByteArray msg=socket->readAll();//ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}
//发送按钮对应的槽函数
void Widget::on_sendButton_clicked()
{//获取ui界面输入的内容QString msg=userName+":"+ui->msgEdit->text();
//发送给服务器socket->write(msg.toLocal8Bit());//清空编辑框内容ui->msgEdit->clear();}
//断开服务器
void Widget::on_disconnectButton_clicked()
{QString msg=userName+": 我走了";socket->write(msg.toLocal8Bit());//断开连接socket->disconnectFromHost();//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次即可,所以放在构造函数中进行}void Widget::disconnected_slot()
{QMessageBox::information(this,"提示","退出成功");
}