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("连接已断开!!!"));
}