本文共 4862 字,大约阅读时间需要 16 分钟。
------------h-------#ifndef SERVERWIDGET_H#define SERVERWIDGET_H#include#include //监听套接字#include //通信套接字QT_BEGIN_NAMESPACEnamespace Ui { class ServerWidget; }QT_END_NAMESPACEclass ServerWidget : public QWidget{ Q_OBJECTpublic: ServerWidget(QWidget *parent = nullptr); ~ServerWidget();private slots: void on_buttonSend_clicked(); void on_buttonClose_clicked();private: Ui::ServerWidget *ui; QTcpServer *tcpServer; QTcpSocket *tcpSocket;};#endif // SERVERWIDGET_H------------cpp-----#include "serverwidget.h"#include "ui_serverwidget.h"ServerWidget::ServerWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::ServerWidget){ ui->setupUi(this); //初始化 tcpServer = NULL; tcpSocket = NULL; //监听套接字 ,指定父对象,自动回收空间 tcpServer = new QTcpServer(this); //bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0); tcpServer->listen(QHostAddress::Any,8888);//bind 和 监听 合在一起了 setWindowTitle("Server"); connect(tcpServer,&QTcpServer::newConnection, [&](){ //取出通信套接字,不需要动态分配 //QTcpSocket *nextPendingConnection(); tcpSocket = tcpServer->nextPendingConnection(); //显示连接的信息在窗口上,获取对方ip和端口 QString ip = tcpSocket->peerAddress().toString(); qint16 port = tcpSocket->peerPort(); //组包 QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port); ui->textEditRead->setText(temp); //接受从客户端的消息,自动触发readyRead() connect(tcpSocket,&QTcpSocket::readyRead, [&](){ //从通信套接字中取出内容 QByteArray array = tcpSocket->readAll(); ui->textEditRead->append(array); }); });// //接受从客户端的消息,自动触发readyRead()// connect(tcpSocket,&QTcpSocket::readyRead,// [&](){// //从通信套接字中取出内容// QByteArray array = tcpSocket->readAll();//// ui->textEditRead->append(array);// });}ServerWidget::~ServerWidget(){ delete ui;}void ServerWidget::on_buttonSend_clicked(){ //获取编辑区的内容 QString str = ui->textEditWrite->toPlainText(); //给对方发送数据,使用套接字是通信套接字 if (tcpSocket != NULL) tcpSocket->write(str.toUtf8().data());}void ServerWidget::on_buttonClose_clicked(){ //主动和客户端断开连接 if (tcpSocket != NULL){ tcpSocket->disconnectFromHost(); tcpSocket->close(); }}
------------------------------------h#ifndef CLIENTWIDGET_H#define CLIENTWIDGET_H#include#include //通信套接字//#include namespace Ui {class ClientWidget;}class ClientWidget : public QWidget{ Q_OBJECTpublic: explicit ClientWidget(QWidget *parent = nullptr); ~ClientWidget();private slots: void on_buttonConnect_clicked(); void on_buttonSend_clicked(); void on_buttonClose_clicked();private: Ui::ClientWidget *ui; QTcpSocket *tcpsocket;};#endif // CLIENTWIDGET_H----------------------------------cpp-----------#include "clientwidget.h"#include "ui_clientwidget.h"#include //QHostAddress(ip) 没有头文件按 会报错ClientWidget::ClientWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ClientWidget){ ui->setupUi(this); tcpsocket = NULL; tcpsocket = new QTcpSocket(this); //virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite); //tcpsocket->connectToHost(,8888); connect(tcpsocket,&QTcpSocket::connected, [=](){ ui->textEditRead->setText("successs to connect server"); }); connect(tcpsocket,&QTcpSocket::readyRead, [=](){ //从通信套接字中取出内容 QByteArray array = tcpsocket->readAll(); ui->textEditRead->append(array); });}ClientWidget::~ClientWidget(){ delete ui;}void ClientWidget::on_buttonConnect_clicked(){ //获取服务器端口和IP qint16 port = ui->lineEditIP->text().toInt(); QString ip = ui->lineEditPort->text(); //主动连接服务器 tcpsocket->connectToHost(QHostAddress(ip), port);}void ClientWidget::on_buttonSend_clicked(){ //获取编辑区的内容 QString str = ui->textEditWrite->toPlainText(); //给对方发送数据,使用套接字是通信套接字 if (tcpsocket != NULL) tcpsocket->write(str.toUtf8().data());}void ClientWidget::on_buttonClose_clicked(){ //主动断开连接 if (tcpsocket != NULL){ tcpsocket->disconnectFromHost(); tcpsocket->close(); }}
#include "serverwidget.h"#include "clientwidget.h"#includeint main(int argc, char *argv[]){ QApplication a(argc, argv); ServerWidget w; ClientWidget c; c.show(); w.show(); return a.exec();}
转载地址:http://ycten.baihongyu.com/