Qt&&C++ 实现Tcp Server

发布时间 2023-12-24 21:59:08作者: Bcaid

关于Qt&C++实现Tcp服务器的一些简易使用笔记...


 "材料"准备

#include <QTcpServer>  //Server需要包含该头文件,Client则不用
#include <QTcpSocket>
#include <QHostAddress>


服务器流程简要

1. 实例化一个QTcpServer对象:   QTcpServer* server = new QTcpServer(this);

2. 开始监听server的ip和端口: server->listen(QHostAddress("127.0.0.1"),12345);

3. 处理信息等...(如下使用说明)

4. 关闭server: server->close();


服务器流程使用说明

在开始监听Server后,如果有客户端连接上,server会发送QTcpServer::newConnection信号,

我们可以在槽函数里面调用server->hasPendingConnections()判断是否还有新连接的客户端,

不断循环去用server->nextPendingConnection()接受新客户端.

使用如下:

while(server->hasPendingConnections())
{
        //nextPendingConnection返回下一个挂起的连接作为已连接的QTcpSocket对象
        //返回的QTcpSocket对象不能在另一个线程使用,可重写incomingConnection()满足需要.
        QTcpSocket *socket=server->nextPendingConnection();
        //...在下面写对于连接上的客户端操作
}

对于读取客户端发来的数据,我们可以用另一个槽函数处理,因为每当客户端发来消息时,socket对象会发送QTcpSocket::readyRead的信号

我们可以判断client发送的消息并对对方发送数据( 发送数据需要用客户端的套接字的write方法, socket->write(QByteArray类型数据); )

对上面的代码稍作修改,就是这样:

 

while(server->hasPendingConnections())
{
        //nextPendingConnection返回下一个挂起的连接作为已连接的QTcpSocket对象
        //返回的QTcpSocket对象不能在另一个线程使用,可重写incomingConnection()满足需要.
        QTcpSocket *socket=server->nextPendingConnection();
        //...在下面写对于连接上的客户端操作
    
        connect(socket,&QTcpSocket::readyRead,[this,socket]{
            //当socket发来消息,在这里处理即可
            if(socket->bytesAvailable()<=0)//如果没消息可以获取就返回
                return;
            QByteArray readbytes = socket->readAll();//此时socket->readAll();即可获取套接字传来的信息
            //...剩余其他操作在后面处理即可
            socket->write(QString("read success").toUtf8());//利用socket这样就可以发送数据
        });
}