Qt实现TCP通信简例

参考

QT TCP socket通信(一)

Notes

  • 继上篇Qt实现UDP通信简例 后,换成用 TCP 的版本,依旧是没有图形界面
  • 注意同上篇
  • client 执行connectToHost()后,server 的imcomingConnection()emit newConnection()
  • server 的close()会调disconnectFromHost(),它会emit disconnected()
  • 此例是 server 收到信息后就主动断开连接
  • 从 client 和 server 的结构看,server 本身也可以充当一个 client。要实现 P2P 既是 client 又是 server 的要求,我有一个大胆的想法:TcpServer 里多加一个 QTcpSocket 的指针就直接当 P2P 的软件

流程

  1. client 向 server 发连接请求(connectToHost()
  2. server 收到请求(newConnection()),同意建立连接(accept_connection()
  3. client 收到同意(connected()),向 server 发数据(send_message()
  4. server 收到数据(readyRead()),读取并回复 client(read_and_reply()),然后断交(close()
  5. client 收到断交通知(disconnected()

Code

客户端

TcpClient.h

#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <QObject>
#include <QTcpSocket>

class TcpClient : public QObject
{
    Q_OBJECT

public:
    TcpClient(QObject *p = 0);
    ~TcpClient();

public slots:
    void send_msg(); // 向server发信息
    void read_msg(); // 读server回复的信息
    void end_connent(); // 被断开连接后提示

private:
    QTcpSocket *tSocket;
};

#endif // TCPCLIENT_H

TcpClient.cpp

#include <QByteArray>
#include <QHostAddress>
#include <QTcpSocket>
#include <iostream>
#include "tcpclient.h"

const quint16 PORT = 2333;

TcpClient::TcpClient(QObject *p) :
    QObject(p)
{
    tSocket = new QTcpSocket(this);
    std::cout << "--- Connect to Host ---" << std::endl;
    /* 向 server 发送连接请求 */
    tSocket->connectToHost(QHostAddress::LocalHost, PORT);
    /*------- 连接信号与槽 -------*/
    /* 一连上 server 就发信息 */
    connect(tSocket, SIGNAL(connected()),
        this, SLOT(send_msg()));
    /* server 有回复就读取 */
    connect(tSocket, SIGNAL(readyRead()),
        this, SLOT(read_msg()));
    /* server 把连接断了就发出提示 */
    connect(tSocket, SIGNAL(disconnected()),
        this, SLOT(end_connent()));
}

TcpClient::~TcpClient()
{
    delete tSocket;
}

void TcpClient::send_msg()
{
    std::cout << "--- Successfully Connected ---\n"
              << "--- Sending Message ---"
              << std::endl;
    /* 发信息 */
    tSocket->write(QByteArray("Hello world!"));
}

void TcpClient::read_msg()
{
    /* 读信息 */
    QByteArray ba = tSocket->readAll();
    std::cout << ba.data() << std::endl;
}

void TcpClient::end_connent()
{
    std::cout << "--- Connection Ended ---" << std::endl;
}

main.cpp

#include <QCoreApplication>
#include "tcpclient.h"
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    std::cout << "--- TCP Client ---" << std::endl;
    TcpClient tc;

    return a.exec();
}

服务器

TcpServer.h

#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QTcpServer>
#include <QTcpSocket>

class TcpServer : QTcpServer
{
    Q_OBJECT

public:
    TcpServer(QTcpServer *p = 0);
    ~TcpServer();

public slots:
    void accept_connection(); // 处理连接请求
    void read_and_reply(); // 读信息并回复,然后断连

private:
    QTcpServer *tServer;
    QTcpSocket *tSocket;
};

#endif // TCPSERVER_H

TcpServer.cpp

#include <QByteArray>
#include <QHostAddress>
#include <iostream>
#include "tcpserver.h"

const quint16 PORT = 2333;

TcpServer::TcpServer(QTcpServer *p) :
    QTcpServer(p)
{
    tServer = new QTcpServer;
    tSocket = new QTcpSocket;
    /* 监听端口 */
    if(tServer->listen(QHostAddress::Any, PORT))
        std::cout << "--- Linsting to Port ---" << std::endl;
    else
        std::cout << "*** FAIL LISTING ***" << std::endl;
    /* 有新连接请求就处理它 */
    connect(tServer, SIGNAL(newConnection()),
        this, SLOT(accept_connection()));
}

TcpServer::~TcpServer()
{
    delete tServer;
    delete tSocket;
}

void TcpServer::accept_connection()
{
    std::cout << "--- Accept Connection ---" << std::endl;
    /* server让自己的socket与client的socket相连 */
    tSocket = tServer->nextPendingConnection();
    /* socket一收到信息就读取并回复 */
    connect(tSocket, SIGNAL(readyRead()),
        this, SLOT(read_and_reply()));
}

void TcpServer::read_and_reply()
{
    std::cout << "--- Read Message ---" << std::endl;
    /* 读信息 */
    QByteArray ba = tSocket->readAll();
    std::cout << ba.data() << std::endl;
    std::cout << "--- Reply ---" << std::endl;
    /* 回复 */
    tSocket->write("Nice day");
    tSocket->close();
}

main.cpp

#include <QCoreApplication>
#include <iostream>
#include "tcpserver.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    std::cout << "--- TCP Server ---" << std::endl;
    TcpServer ts;

    return a.exec();
}

截图

工程截图

project

效果

result

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值