QTcpServer类提供了一个基于TCP的服务器。
这个类能够接受传入的TCP链接。您能够指定端口或让QTcpServer自动选择一个端口。您能够收听特定地址或全部机器的地址。
调用listen()让服务器侦听传入的链接。每次客户端链接到服务器时,都会发出newConnection()信号。html
QTcpSocket类提供了一个TCP套接字。
TCP(传输控制协议)是一种可靠的,面向流的,面向链接的传输协议。 它特别适合连续传输数据。
QTcpSocket是QAbstractSocket的一个方便的子类,它容许你创建一个TCP链接并传输数据流。服务器
服务器端以监听的方式监听客服端是否有链接请求网络
客户端以调用connectToHost()函数主动链接服务器端并发
创建服务器对象app
listen服务器, 经过创建的服务器 监听指定地址/端口的客服端;判断是否有客户链接有链接就触发newConnection();socket
经过connect处理newConnection()信号;
server = new QTcpServer(this); //创建一个服务器对象 server->listen(QHostAddress::Any, 8000);//经过创建的服务器监听指定ip地址及端口号的客服端,如不指定端口号,系统会随机分配 connect(server, QTcpServer::newConnection, [=]() { qDebug() << "有链接进来"; } );
创建QTcpSocket套节字(ip,端口)tcp
经过套节字connectToHost()函数主动链接服务器;链接成功则触发服务器QTcpServer::newConnection信号;并发送套节字到服务器端;ide
关闭链接;函数
QTcpSocket Sc(this); Sc.connectToHost("127.0.0.1", 8888);//实际代码中参数要进行类型转化 Sc.close();
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer> #include <QTcpSocket> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void on_buttonsend_clicked(); private: Ui::Widget *ui; QTcpServer *server; //创建服务器对象 QTcpSocket *socket; //套节字对象 QByteArray tp; // }; #endif // WIDGET_H
服务器端cpp文件 widget.cpp学习
#include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); setWindowTitle("服务器"); tp = nullptr; server = new QTcpServer(this); server->listen(QHostAddress::Any, 8000); connect(server, QTcpServer::newConnection, [=]() { socket = server->nextPendingConnection(); connect(socket, &QTcpSocket::readyRead, [=]() { tp = socket->readAll(); ui->testdis->append(tp); }); } ); } Widget::~Widget() { delete ui; } void Widget::on_buttonsend_clicked() { socket->write(ui->textEdit->toPlainText().toUtf8()); }
客户端头文件socket.h:
#ifndef SOCKET_H #define SOCKET_H #include <QWidget> #include <QTcpSocket> #include <QHostAddress> namespace Ui { class socket; } class socket : public QWidget { Q_OBJECT public: explicit socket(QWidget *parent = 0); ~socket(); private slots: void on_buttonLink_clicked(); void on_buttonsend_clicked(); void on_serverclose_clicked(); private: Ui::socket *ui; QTcpSocket *sock; QHostAddress adrs; quint16 port; }; #endif // SOCKET_H
客户端cpp文件socket.cpp
#include "socket.h" #include "ui_socket.h" socket::socket(QWidget *parent) : QWidget(parent), ui(new Ui::socket) { ui->setupUi(this); sock = new QTcpSocket(this); setWindowTitle("张三"); connect(sock, &QTcpSocket::readyRead, [=]() { ui->textdis->append(sock->readAll()); }); } socket::~socket() { delete ui; } void socket::on_buttonLink_clicked() { QString ip = ui->serverIP->text(); QString p = ui->serverPort->text(); sock->connectToHost(ip, p.toUShort()); } void socket::on_buttonsend_clicked() { QString temp = ui->textEdit->toPlainText(); if(!temp.isEmpty())sock->write(temp.toUtf8()); } void socket::on_serverclose_clicked() { sock->close(); }
main.cpp文件
#include "widget.h" #include <QApplication> #include "socket.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); socket w1; w1.show(); return a.exec(); }
运行的效果如图所示
后续的通讯例子还在学习中,本文的参考连接:
(1)https://www.cnblogs.com/flowingwind/p/8348519.html