zoukankan      html  css  js  c++  java
  • QT socket网络通信

    https://blog.csdn.net/u013007900/article/details/50411796

    里主要讲解如何实现TCP和UDP的简单通信。

    socket简介
    在LINUX下进行网络编程,我们可以使用LINUX提供的统一的套接字接口。但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样那样的错误。QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作。而且它采用QT本身的signal-slot机制,使编写的程序更容易理解。

    这是文档。个人觉得,QT的文档除了缺少一些例子,其他还是不错的。

    QT5中相比于QT4应该更新了一些socket的应用,QT4相比于QT3也更新了不少,而且还改了很多的类名,大家在网上找资料的时候一定要注意。
    ---------------------

    UDP通信

    UDP没有特定的server端和client端,简单来说就是向特定的ip发送报文,因此我把它分为发送端和接收端。

    注意:在.pro文件中要添加QT += network,否则无法使用Qt的网络功能。

    #include <QtNetwork>
    QUdpSocket *sender;
    sender = new QUdpSocket(this);
    
    QByteArray datagram = “hello world!”;
    
    //UDP广播
    sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,6665);
    
    //向特定IP发送
    QHostAddress serverAddress = QHostAddress("10.21.11.66");
    sender->writeDatagram(datagram.data(), datagram.size(),serverAddress, 6665);
    
    /* writeDatagram函数原型,发送成功返回字节数,否则-1
    qint64 writeDatagram(const char *data,qint64 size,const QHostAddress &address,quint16 port)
    qint64 writeDatagram(const QByteArray &datagram,const QHostAddress &host,quint16 port)
    */
    
    

      

    UDP接收端

    #include <QtNetwork>
    QUdpSocket *receiver;
    
    //信号槽
    private slots:  
        void readPendingDatagrams(); 
    
    receiver = new QUdpSocket(this);
    receiver->bind(QHostAddress::LocalHost, 6665);
    connect(receiver, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));
    
    void readPendingDatagrams()
     {
         while (receiver->hasPendingDatagrams()) {
             QByteArray datagram;
             datagram.resize(receiver->pendingDatagramSize());
             receiver->readDatagram(datagram.data(), datagram.size());
             //数据接收在datagram里
    /* readDatagram 函数原型
    qint64 readDatagram(char *data,qint64 maxSize,QHostAddress *address=0,quint16 *port=0)
    */
         }
     }
    
    

      

    TCP通信

    TCP的话要复杂点,必须先建立连接才能传输数据,分为server端和client端。

    TCP client端

    #include <QtNetwork>
    QTcpSocket *client;
    char *data="hello qt!";
    client = new QTcpSocket(this);
    client->connectToHost(QHostAddress("10.21.11.66"), 6665);
    client->write(data);
    
    

      TCP server端

    #include <QtNetwork>
    QTcpServer *server;
    QTcpSocket *clientConnection;
    server = new QTcpServer();
    server->listen(QHostAddress::Any, 6665);
    connect(server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
    void acceptConnection()
    {
        clientConnection = server->nextPendingConnection();
        connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readClient()));
    }
    void readClient()
    {
        QString str = clientConnection->readAll();
        //或者
        char buf[1024];
        clientConnection->read(buf,1024);
    }
    
    

      

    至于传中文乱码的问题,其实可以在前面的文章中解决。

    也可以看看这个

    ----------------------------------------------------------------------------------------

    将有关编码的代码全部删除后,通过了 并且能够运行。但是。。

    挺萌的,乱码。发送和接受都乱码。

    研究找到解决方法如下。

    参考两段代码,发送和接受的:

    发送:、

    void TcpS::btn_send()
    {
         QByteArray datasend = ui->textEdit->toPlainText().toLocal8Bit();
         m_tcpsocket->write(datasend);
    }
    

      

    接收:

    void TcpS::read_datagram()
    {
        QByteArray dataread = m_tcpsocket->readAll();
        QString str = QString::fromLocal8Bit(dataread);
        ui->textBrowser->insertPlainText(str+"
    ");
    }
    

      

  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/10323325.html
Copyright © 2011-2022 走看看