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

Qt TCP的客户端与服务端的连接,供大家参考,具体内容如下
可以实现局域网内简单的信息传递(文件传输,稍后更新)
界面是用ui设计师做的简单设计
【Qt基于TCP实现客户端与服务端的连接】Qt基于TCP实现客户端与服务端的连接
文章图片

客户端
(1)、ClientWidget.h 头文件

#ifndef CLIENTWIDGET_H#define CLIENTWIDGET_H#include #include "ui_ClientWidget.h"#include #include #include class ClientWidget : public QWidget, public Ui::ClientWidget{Q_OBJECTpublic: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 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())); //接收来自服务器的内容,信号readReadyconnect(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 #include "ui_ServerWidget.h"#include #include #include #include class ServerWidget : public QWidget{Q_OBJECTpublic: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 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(); //给对方发送数据。使用套接字是tcpSockettcpSocket->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("连接已断开!!!")); }

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

    推荐阅读