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

2022-08-22 11:41:59

QtTCP的客户端与服务端的连接,供大家参考,具体内容如下可以实现局域网内简单的信息传递(文件传输,稍后更新)界面是用ui设计师做的简单设计客户端(1)、ClientWidget.h头文件#ifn...

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

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

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

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

客户端

(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()));
 //给服务器发送内容
 connectjavascript(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("连接已断开!!!"));

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。