QT 两种套接字QLocalSocket、QTcpSocket的使用

原创
2021/08/13 16:20
阅读数 3K

--------QLocalSocket 
用于本地进程间套接字通信
1、清理server并且开始监听
QLocalServer::removeServer("ServerName");
m_server->listen("ServerName");
2、 serverNewConnectionHandler处理监听连接后绑定read回调函数socketReadyReadHandler
3、 m_server->nextPendingConnection();获取一个server socket负责本次连接,
处理结束后deletelater
4、处理过程就是业务逻辑read+write
 
服务器代码:
m_server = new QLocalServer;
    private:
    QLocalServer *m_server;
        connect(m_server, SIGNAL(newConnection()), SLOT(serverNewConnectionHandler()));
监听到一个新的连接请求触发槽函数
通过调用nextPendingConnection()响应一个等待中的连接请求,返回一个指针,指向用于与client建立通信的QLocalSocket。
serverNewConnectionHandler()--------------m_server->nextPendingConnection()

用于和client建立联系的socket server 进行接收函数和断开连接的槽绑定
QLocalSocket* socket = m_server->nextPendingConnection();
connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyReadHandler()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));

用来读取client发送信息并且返回给client:
对应read和write

void socketReadyReadHandler()
    {
        QLocalSocket* socket = static_cast<QLocalSocket*>(sender());
        if (socket)
        {
            QTextStream stream(socket);
            qDebug() << "Read Data From Client:" << stream.readAll();

            QString response = "Hello Client";
            socket->write(response.toUtf8());
            socket->flush();
        }
        // 返回到客户端的void sendMessage 方法,m_socket->waitForReadyRead()之后的操作
    }
    
    

客户端代码:
--------QLocalSocket 
1、创建对象CClient client;
2、连接服务端client.ConnectToServer("ServerName");
3、发送消息client.sendMessage("Hellow Server");
4、断开连接,释放指针
m_socket->disconnectFromServer();
delete m_socket;
        
代码解读:
        m_socket = new QLocalSocket();
        connect(m_socket, SIGNAL(connected()), SLOT(socketConnectedHandler()));
        connect(m_socket, SIGNAL(disconnected()), SLOT(socketDisConnectedHandler()));
        connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), SLOT(socketErrorHandler(QLocalSocket::LocalSocketError)));
连接成功槽
断开连接槽
使用过程错误信息槽
 void socketConnectedHandler()
    {
        qDebug() << "connected.";
    }

    void socketDisConnectedHandler()
    {
        qDebug() << "disconnected.";
    }

    void socketErrorHandler(QLocalSocket::LocalSocketError error)
    {
        qWarning() << error;
    }
--------QLocalSocket 


--------QTcpSocket 
server端代码:
1、new QTcpServer(this);   创建QTcpServer对象
2、m_tcpServer->listen(QHostAddress::Any,19999);设置监听的端口
3、connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(newConnect())); 定义一个新连接槽
4、获取连接的socket 并且绑定读取槽
5、读取client发送的信息,wirte返回给client

void Testnet::newConnect()  
{  
        m_tcpSocket = m_tcpServer->nextPendingConnection(); //得到每个连进来的socket  
        connect(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage())); //有可读的信息,触发读函数槽  
    //断开自动清楚资源deletelater槽
}  

void Testnet::readMessage() //读取信息  
{  
    QByteArray qba= m_tcpSocket->readAll(); //读取  
    qDebug()<<qba;   
    m_tcpSocket->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str())); //发送 
}  


client端代码:
1、创建对象,终止当前连接并且扔掉缓冲区数据
2、连接服务器:端口m_tcpSocket->connectToHost("192.168.1.178",19999);  
3、发送数据m_tcpSocket->write(ss.toStdString().c_str(),strlen(ss.toStdString().c_str()));  
4、读取信息槽绑定connect(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(readMesg())); 
5、清理连接close,delete

注意事项:
1)只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器,并返回是否连接的结果 
    //循环连接
    //Wait for LocalCommunicate established
    while(!LocalCommunicate::instance()->waitForConnected()) {
        QThread::msleep(500);
        LocalCommunicate::instance()->setServerName(LOCALSERVER);
        LocalCommunicate::instance()->connectToServer(QIODevice::ReadWrite);
    }
    
2)避免内存泄露 connect(myClient, SIGNAL(disconnected()),myClient, SLOT(deleteLater())); 
            connect(m_tcpSocketConnected, SIGNAL(disconnected()), this, SLOT(slotTCPDisConnected()));
也可在这里直接执行deleteLater

--------QTcpSocket 


 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部