Qt基于TCP实现客户端与服务端的连接

Anna ·
更新时间:2024-09-20
· 1536 次阅读

Qt TCP的客户端与服务端的连接,供大家参考,具体内容如下

可以实现局域网内简单的信息传递(文件传输,稍后更新)

界面是用ui设计师做的简单设计

客户端

(1)、ClientWidget.h 头文件

#ifndef CLIENTWIDGET_H #define CLIENTWIDGET_H #include <QWidget> #include "ui_ClientWidget.h" #include <QTcpSocket> #include <QHostAddress> #include <QTextCodec> class ClientWidget : public QWidget, public Ui::ClientWidget {     Q_OBJECT public:     ClientWidget(QWidget *parent = 0);     ~ClientWidget(); private slots:     //连接按钮     void onConnectButtonClicked();     //     void onTextEditRead();     //发送按钮     void onButtonSendClicked();     //获取对方发送的内容     void onRecesiveDataFromServer();     //断开连接     void onDisConnect(); private:     //Ui::ClientWidget ui;     QTcpSocket *tcpSocket; }; #endif // CLIENTWIDGET_H

(2)、ClientWidget.cpp文件

#include "stdafx.h" #include "ClientWidget.h" #include <QPushButton> ClientWidget::ClientWidget(QWidget *parent)     : QWidget(parent) {     setupUi(this);     setWindowTitle(QString::fromWCharArray(L"客户端"));     tcpSocket = NULL;     //分配空间,指定父对象     tcpSocket = new QTcpSocket(this);     ButtonDisconnect->setEnabled(false);     //tcpSocket->abort();     //发送与服务器连接信号     connect(connectBtn, SIGNAL(clicked()), this, SLOT(onConnectButtonClicked()));     //连接成功后接收到connected信号     connect(tcpSocket, SIGNAL(connected()), this, SLOT(onTextEditRead()));     //给服务器发送内容     connect(ButtonSend, SIGNAL(clicked()), this, SLOT(onButtonSendClicked()));     //接收来自服务器的内容,信号readReady     connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(onRecesiveDataFromServer()));     connect(ButtonDisconnect, SIGNAL(clicked()), this, SLOT(onDisConnect())); } ClientWidget::~ClientWidget() { } void ClientWidget::onConnectButtonClicked() {     //获取服务器IP和端口     QString ipStr = LineEditIPName->text();     qint16 portName = LineEditPortName->text().toInt();     QHostAddress ip = QHostAddress(ipStr);     //主动和服务器建立连接     tcpSocket->connectToHost(ip, portName); } void ClientWidget::onTextEditRead() {     TextEditRead->setText(QString::fromLocal8Bit("成功和服务器建立好连接!!!"));     connectBtn->setEnabled(false);     ButtonDisconnect->setEnabled(true); } void ClientWidget::onButtonSendClicked() {     if (tcpSocket == NULL)     {         return;     }     //获取编辑框内容     QString str = TextEditWrite->toPlainText();     //发送文本内容     tcpSocket->write(str.toUtf8().data());     TextEditWrite->clear(); } void ClientWidget::onRecesiveDataFromServer() {     QByteArray arrayAll = tcpSocket->readAll();     QTextCodec *tc = QTextCodec::codecForName("UTF-8");     QString str = tc->toUnicode(arrayAll);     //追加到读取编辑区中     TextEditRead->append(str); } void ClientWidget::onDisConnect() {     if (tcpSocket == NULL)     {         return;     }     tcpSocket->disconnectFromHost();     tcpSocket->close();     connectBtn->setEnabled(true);     ButtonDisconnect->setEnabled(false);     TextEditRead->setText(QString::fromLocal8Bit("连接已断开!!!")); } 服务器

(1)、ServerWidget.h文件

#ifndef SERVERWIDGET_H #define SERVERWIDGET_H #include <QtGui/QWidget> #include "ui_ServerWidget.h" #include <QTcpServer> #include <QTcpSocket> #include <QString> #include <QTextCodec> class ServerWidget : public QWidget {     Q_OBJECT     public:     ServerWidget(QWidget *parent = 0, Qt::WFlags flags = 0);     ~ServerWidget();     QTcpServer *tcpServer;     QTcpSocket *tcpSocket; private slots:     void OnConnectTcpServer();      void OnSendButtonClicked();     void OnCloseButtonClicked();     void OnSeResiveData();     void OnDisconnected(); private:     Ui::ServerWidgetClass ui; }; #endif // SERVERWIDGET_H

(2)、ServerWidget.cpp 文件

#include "stdafx.h" #include "ServerWidget.h" ServerWidget::ServerWidget(QWidget *parent, Qt::WFlags flags)     : QWidget(parent, flags) {     ui.setupUi(this);     tcpServer = NULL;     tcpSocket = NULL;     setWindowTitle(QString::fromWCharArray(L"服务器(端口:8888)"));     //箭筒套接字,指定父对象,让其自动回收空间     tcpServer = new QTcpServer(this);     //监听并绑定端口     tcpServer->listen(QHostAddress::Any, 8888);     connect(tcpServer, SIGNAL(newConnection()), this, SLOT(OnConnectTcpServer()));     connect(ui.sendButton, SIGNAL(clicked()), this, SLOT(OnSendButtonClicked()));     connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(OnCloseButtonClicked()));     connect(tcpServer, SIGNAL(disconnected()), this, SLOT(OnDisconnected())); } ServerWidget::~ServerWidget() { } #include <QDebug> void ServerWidget::OnConnectTcpServer() {     //取出建立好的套接字     tcpSocket = tcpServer->nextPendingConnection();     //获取对方的IP和端口号      QString ipStr = tcpSocket->peerAddress().toString();     qint16 portName = tcpSocket->peerPort();     QString connectStr = QString::fromLocal8Bit("成功连接");     QString tempStr = QString("[%1 : %2]:" + connectStr).arg(ipStr).arg(portName);     ui.textRead->setText(tempStr);     connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(OnSeResiveData())); } void ServerWidget::OnSendButtonClicked() {     if (tcpSocket == NULL)     {         return;     }     //获取编辑区的内容     QString str = ui.textWrite->toPlainText();     //给对方发送数据。使用套接字是tcpSocket     tcpSocket->write(str.toUtf8().data());     ui.textWrite->clear(); } void ServerWidget::OnCloseButtonClicked() {     if (tcpSocket == NULL)     {         return;     }     //主动和客户端断开连接     tcpSocket->disconnectFromHost();     ui.textRead->setText(QString::fromLocal8Bit("连接已断开!!!"));     tcpSocket = NULL; } void ServerWidget::OnSeResiveData() {     //从通信套接字中取出内容     QByteArray dataAll =  tcpSocket->readAll();     QTextCodec *tc = QTextCodec::codecForName("UTF-8");     QString str = tc->toUnicode(dataAll);     ui.textRead->append(str); } void ServerWidget::OnDisconnected() {     ui.textRead->setText(QString::fromLocal8Bit("连接已断开!!!")); }



tcp 客户端 服务端 连接

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章