通信示意图
一、ui设计
- 服务器端
所用控件类型以及对象名如图所示,最好修改默认的命名以便于区别,在设置textEditRead时可以将它设置为readOnly
- 客户端
所用控件类型以及对象名如图所示,最好修改默认的命名以便于区别,在设置textEditRead时可以将它设置为readOnly
二、代码设计
两个窗口创建好之后,记得在.pro文件中添加network,即QT += core gui network
,这样才能使用QTcpServer和QTcpSocket。
-
服务器端
1.在
serverwidget.h
包含库,创建Server和Socket指针#include<QTcpServer> #include<QTcpSocket> ... ... private: Ui::ServerWidget *ui; QTcpServer *tcpServer; QTcpSocket *tcpSocket;
2.
serverwidget.cpp
中代码#include "serverwidget.h" #include "ui_serverwidget.h" ServerWidget::ServerWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::ServerWidget) { ui->setupUi(this); setWindowTitle("服务器:8888"); tcpServer=NULL; tcpSocket=NULL; tcpServer = new QTcpServer(this); tcpServer->listen(QHostAddress::Any,8888); connect(tcpServer,&QTcpServer::newConnection,[=](){ tcpSocket=tcpServer->nextPendingConnection(); QString ip = tcpSocket->peerAddress().toString(); qint16 port = tcpSocket->peerPort(); QString str=QString("[%1:%2]:连接成功").arg(ip).arg(port); ui->textEditRead->setText(str); connect(tcpSocket,&QTcpSocket::readyRead,[=](){ QByteArray arr =tcpSocket->readAll(); ui->textEditRead->append(arr); }); }); } ServerWidget::~ServerWidget() { delete ui; } void ServerWidget::on_buttonSend_clicked() { if(tcpSocket==NULL) { return; } QString str=ui->textEditWrite->toPlainText(); tcpSocket->write(str.toUtf8().data()); ui->textEditWrite->clear(); } void ServerWidget::on_buttonClose_clicked() { if(tcpSocket==NULL) return; tcpSocket->disconnectFromHost(); tcpSocket->close(); tcpSocket=NULL; }
-
客户端
1.在
clientwidget.h
包含库,创建Socket指针#include <QTcpSocket> ... ... private: Ui::ClientWidget *ui; QTcpSocket *tcpSocket;
2.在
clientwidget.cpp
的代码#include "clientwidget.h" #include "ui_clientwidget.h" #include<QHostAddress> ClientWidget::ClientWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ClientWidget) { ui->setupUi(this); setWindowTitle("客户端"); tcpSocket=NULL; tcpSocket=new QTcpSocket(this); connect(tcpSocket,&QTcpSocket::connected,[=](){ ui->textEditRead->setText(QString("连接服务器成功!")); }); connect(tcpSocket,&QTcpSocket::readyRead,[=](){ QByteArray arr= tcpSocket->readAll(); ui->textEditRead->append(arr); }); } ClientWidget::~ClientWidget() { delete ui; } void ClientWidget::on_buttonConnect_clicked() { qint16 port=ui->lineEdit->text().toInt(); QString ip = ui->lineEdit_2->text(); tcpSocket->connectToHost(QHostAddress(ip),port); } void ClientWidget::on_buttonSend_clicked() { if(!tcpSocket->isOpen()) return; QString str=ui->textEditWrite->toPlainText(); tcpSocket->write(str.toUtf8().data()); ui->textEditWrite->clear(); } void ClientWidget::on_buttonClose_clicked() { if(!tcpSocket->isOpen()) return; tcpSocket->disconnectFromHost(); tcpSocket->close(); }