Qt建立TCP/IP连接

Qt 有封装好的QTcpServer和QTcpSocket类,使用比较方便。

服务器端代码:

头文件

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>

class server : public QObject
{
    Q_OBJECT
public:
    explicit server(QObject *parent = nullptr);
    void     beingListen(QHostAddress addr = QHostAddress::Any, unsigned port = 5800);
    void     sendMessage(QByteArray msg);

private slots:
    void     connectClient();
    void     msgFromClient();
    void     disconnectClient();

private:
    QTcpServer* _server;
    QTcpSocket* _socket;
};

源文件

#include "server.h"

server::server(QObject *parent)
    : QObject(parent),
      _server(new QTcpServer()),
      _socket(nullptr)
{

}

void server::beingListen(QHostAddress addr, unsigned port)
{
    if (_server->listen(addr, port)) {
        printf("begin listening!\n");
    } else {
        printf("%s\n", _server->errorString().toLatin1().data());
    }

    connect(_server, SIGNAL(newConnection()), this, SLOT(connectClient()));
}

void server::sendMessage(QByteArray msg)
{
    _socket->write(msg);
}

void server::connectClient()
{
    _socket = _server->nextPendingConnection();
    printf("server connected client\n");

    connect(_socket, SIGNAL(readyRead()), this, SLOT(msgFromClient()));
    connect(_socket, SIGNAL(disconnected()), this, SLOT(disconnectClient()));
}

void server::msgFromClient()
{
    QByteArray str = _socket->readAll();
    printf("Message form client: %s\n", str.data());
}

void server::disconnectClient()
{
    printf("client disconnected!\n");
}
//服务端main.cpp
#include <QCoreApplication>
#include "server.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    server s;
    s.beingListen();

    return a.exec();
}

客户端代码

头文件

#include <QObject>
#include <QTcpSocket>

class client : public QObject
{
    Q_OBJECT
public:
    explicit client(QObject *parent = nullptr);
    void     connectHost(QString ip, unsigned port);
    void     sendMessage(QByteArray msg);

private slots:
    void     connected();
    void     disConnected();
    void     msgFromServer();


private:
    QTcpSocket*     _socket;
};

源文件

#include "client.h"
#include <QHostAddress>
client::client(QObject *parent)
    : QObject(parent),
      _socket(new QTcpSocket())
{

}

void client::connectHost(QString ip, unsigned port)
{
    printf("connect host\n");
    QHostAddress addr = QHostAddress(ip);
    _socket->connectToHost(addr, port);
    connect(_socket, SIGNAL(connected()), this, SLOT(connected()));
    connect(_socket, SIGNAL(disconnected()), this, SLOT(disConnected()));
    connect(_socket, SIGNAL(readyRead()), this, SLOT(msgFromServer()));
}

void client::sendMessage(QByteArray msg)
{
    _socket->write(msg);
}

void client::connected()
{
    printf("client connected server!\n");
}

void client::disConnected()
{
    printf("client disConnected server!\n");
}

void client::msgFromServer()
{
    QByteArray msg = _socket->readAll();
    printf("message from server: %s\n", msg.data());
}

//客户端main.cpp
#include <QCoreApplication>
#include "client.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    client c;
    c.connectHost("127.0.0.1", 5800);
    c.sendMessage("dddd");
    return a.exec();
}

由于是在同一台电脑上运行的,客户端连接的hostAddress为本机地址:127.0.0.1

如果服务器端要连接多个客户端,可以用map<int, QTcpSocket> 保存连接的socket,int为socket的编号。

//接受消息时,通过下面代码获取发送方是哪个socket
QTcpSocket *socket = static_cast<QTcpSocket*>(sender());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值