使用网络编程,要在项目文件中添加 QT+=network;
一、服务器程序
#include "serverwidget.h"
#include "ui_serverwidget.h"
ServerWidget::ServerWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::ServerWidget)
{
ui->setupUi(this);
tcpsocket=nullptr;
tcpserver=nullptr;
setWindowTitle("服务器");
tcpserver = new QTcpServer(this);//分配空间,指定父对象,自动回收空间
tcpserver->listen(QHostAddress::Any,8888);//监听所有地址的8888端口
connect(tcpserver,&QTcpServer::newConnection, //新连接信号
[=]
{
tcpsocket = tcpserver->nextPendingConnection();//取出tcpserver套接字的下一个链接套接字,也就是tcpsocket
QString ip = tcpsocket->peerAddress().toString(); //获取客户端IP
quint16 port = tcpsocket->peerPort(); //获取客户端端口
QString ipAndPortMessage = QString("[%1:%2]--成功链接").arg(ip).arg(port);
ui->messageEdit->setText(ipAndPortMessage); //在UI上显示成功链接
connect(tcpsocket,&QTcpSocket::readyRead, //连接准备读信号
[=]
{
QByteArray array = tcpsocket->readAll();//读所有信息,保存在数组中
ui->messageEdit->append(array); //接收到的信息显示在UI上
}
);
connect(tcpsocket,&QTcpSocket::disconnected, //连接断开信号
[=]
{
ui->messageEdit->setText("客户端"+ip+":"+QString::number(port,10)+"断开");//UI上显示已断开
}
);
}
);
}
ServerWidget::~ServerWidget()
{
delete ui;
}
void ServerWidget::on_sendButton_clicked()//发送按钮
{
if(tcpsocket==nullptr)
{
return;
}
QString senMessage;
senMessage = ui->sendEdit->toPlainText();
tcpsocket->write(senMessage.toUtf8().data());//发送数据
}
void ServerWidget::on_closeButton_clicked()//断开连接按钮
{
if(tcpsocket==nullptr)
{
return;
}
tcpsocket->disconnectFromHost();//断开链接
tcpsocket->close();
tcpsocket=nullptr;
}
二、客户端程序
#include "clianwidget.h"
#include "ui_clianwidget.h"
#include <QHostAddress>
ClianWidget::ClianWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ClianWidget)
{
ui->setupUi(this);
setWindowTitle("客户端");
tcpSocket = new QTcpSocket(this);
connect(tcpSocket,&QTcpSocket::connected,
[=]
{
ui->messageBrowser->setText("已连接");
}
);
connect(tcpSocket,&QTcpSocket::readyRead,
[=]
{
QByteArray array = tcpSocket->readAll();
ui->messageBrowser->append(array);
}
);
connect(tcpSocket,&QTcpSocket::disconnected,
[=]
{
ui->messageBrowser->setText("与服务器断开");
}
);
}
ClianWidget::~ClianWidget()
{
delete ui;
}
void ClianWidget::on_connectButton_clicked()//连接服务器按钮
{
QString ip = ui->ipEdit->text();
quint16 port = static_cast<quint16>( ui->portEdit->text().toUInt());
tcpSocket->connectToHost(QHostAddress(ip),port);//连接服务器
}
void ClianWidget::on_sendButton_clicked()//发送按钮
{
if(tcpSocket==nullptr)
{
return;
}
QString senMessage;
senMessage = ui->sendBrowser->toPlainText();
tcpSocket->write(senMessage.toUtf8().data());//发送数据
}
void ClianWidget::on_closeButton_clicked()//断开连接按钮
{
if(tcpSocket==nullptr)
{
return;
}
tcpSocket->disconnectFromHost();//断开链接
tcpSocket->close();
// tcpSocket=nullptr;
}