您当前的位置: 首页 >  令狐掌门 qt

Qt Tcp通信,简单聊天程序的编写

令狐掌门 发布时间:2020-08-23 16:47:17 ,浏览量:1

    Qt Tcp通信和windows的类似,分服务端和客户端,模型如下

       windows的Tcp通信可以看这篇文章:【请点击查看】    

       Qt的Tcp主要涉及到两类,QTcpServer和QTcpSocket, 对于服务端需要两个socket, 一个用于监听客户端连接,也就是QTcpServer,另一个用于和客户端通信, 也就是QTcpSocket; 客户端只需要一个socket.   写一个简单的demo, 服务端和客户端各用一个窗口表示:

  代码大同小异,服务端

  server.cpp

#include "server.h"
#include "ui_server.h"

Server::Server(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);

    this->setFixedSize(500,700);
    ui->sIP->setText("127.0.0.1");
    ui->sPort->setText("8765");

    // 创建监听套接字
    server = new QTcpServer(this);

    // 监听
    server->listen(QHostAddress(ui->sIP->text()), ui->sPort->text().toInt());

    // 新的链接
    connect(server, &QTcpServer::newConnection, this, [=]()
    {
        conn = server->nextPendingConnection();   // 返回客户端的套接字对象地址
        ui->record->append("had new client connect.....");

        // 接收客户端消息
        connect(conn, &QTcpSocket::readyRead, this, [=]()
        {
            QByteArray array = conn->readAll();
            ui->record->append(array);
        });
    });
}

Server::~Server()
{
    delete ui;
}

void Server::on_sendBtn_clicked()
{
    // 发送数据
    conn->write(ui->msg->toPlainText().toUtf8());
    ui->record->append("Server Say: " + ui->msg->toPlainText());

    // 清楚发送消息框的内容
    ui->msg->clear();
}

    客户端  client.cpp

#include "client.h"
#include "ui_client.h"
#include 

Client::Client(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);

    this->setFixedSize(500,700);
    ui->sIP->setText("127.0.0.1");
    ui->sPort->setText("8765");

    //创建通信套接字
    client = new QTcpSocket(this);

    // 连接接服务器
    client->connectToHost(QHostAddress(ui->sIP->text()), ui->sPort->text().toInt());

    // 接收数据
    connect(client, &QTcpSocket::readyRead, this, [=]()
    {
       QByteArray array = client->readAll();
       ui->record->append(array);
    });
}

Client::~Client()
{
    delete ui;
}

void Client::on_sendBtn_clicked()
{
    client->write(ui->msg->toPlainText().toUtf8());
    ui->record->append("Client Say: " + ui->msg->toPlainText());

    ui->msg->clear();
}

      main函数中把两个窗口都显示出来,

#include "server.h"
#include 
#include "client.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Server w;
    w.setWindowTitle("server");
    w.show();

    Client c;
    c.setWindowTitle("client");
    c.show();

    return a.exec();
}

      demo比较简单,按照开篇的图进行编写代码即可。

      这是一个服务端,对一个客户端,如果是多个客户端呢, 那么可以使用通信模型来实现,比如select模型,可以观看这篇

      

      该项目完整代码链接:https://gitee.com/qwerwo/qt-tcp-msg-demo

 

关注
打赏
1688896170
查看更多评论

令狐掌门

暂无认证

  • 1浏览

    0关注

    485博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0810s