在QT下的基于UDP协议的消息收发程序

前段时间学了Linux高级编程,其中网络编程部分中有一个基于Udp/Tcp的聊天编程给我感觉蛮有趣的,但是只能在命令行收发信息还是显得单调,远远没有图形界面的方便和美观。有没有办法做的漂亮一点呢?强大又低调的QT可以做到这一点。

QT为提供了强大的网络编程接口类供我们使用。QAbstractSocket类提供所有的socket(套接口)类型的公共功能。QAbstractSocket是QUdpSocket和QTcpSocket的共同基类,它包含了这两个类的所有共同函数。在QT中,要创建一个Socket,有两种选择:

1.实例化QUdpSocket或QTcpSocket

2.实例化QAbstractSocket:创建一个本地的Socket描述符,调用 setSocketDescriptor()函数将其实例化

其实QT的Tcp/Ip编程涉及到的类蛮多的,而且大部分都是我刚接触到的,不熟悉。今天看了一下午的帮助文档写了一个简单的基于Udp的消息收发程序。有两个程序,发端负责发消息,收端收到消息并把消息还有发端的IP地址显示出来。为了模拟不同的计算机之间的通信,发送端是在虚拟机的Linux环境下编写的,接收端是在windows

主机下完成的。下面的程序的效果:


接收端 :                                                          发送端: 在QT下的基于UDP协议的消息收发程序_第1张图片

                                        

接收端关键代码:
我声明了三个槽函数

private slots:
    void clicked_details();
    void receive_slots();
    void clicked_open();
clicked_open()函数用于绑定计算机的IP地址和指定端口。bind()函数继承自QAbstractSocket类
void Widget::clicked_open()
{
    if(my_socket->bind(QHostAddress("192.168.1.102"),5566))
    {
        text_details = text_details + ("192.168.1.102 open successed!")+ "\n";
        main_text->setText(text_details);
    }
    else
    {
        text_details = text_details + ("192.168.1.102 open failed!")+ "\n";
        main_text->setText(text_details);
    }
}
clicked_details()用于获取计算机的主要网络信息,并将其显示出来
void Widget::clicked_details()
{
    QString details = "";
    QList mylist = QNetworkInterface::allInterfaces();
    for(int j = 0;j list = interface.addressEntries();
        for(int i = 0;i
当使用bind()函数绑定IP和端口之后,QUdpSocket对象每次收到数据都会产生一个readyRead()信号,所以receive_slot()函数用于处理接收的数据
void Widget::receive_slots()
{
    QHostAddress client_address;//声明一个QHostAddress对象用于保存发送端的信息
    char buf[100];//声明一个字符数组用于接收发送过来的字符串
    if(my_socket->hasPendingDatagrams())
    {
        my_socket->readDatagram(buf,my_socket->pendingDatagramSize(),&client_address,0);
        text_details = text_details + ("receive ") + buf + (" from ") + client_address.toString() + "\n";
        main_text->setText(text_details);
    }
}




发送端的关键代码:

发送端只有一个槽函数用于发送消息
private slots:
    void clicked_send_slot();
void Dialog::clicked_send_slot()
{
    if(!this->edit_for_send->text().isEmpty())
    {
        int port = this->edit_port->text().toInt();
        QString array = this->edit_for_send->text();
        QByteArray byteArray = array.toAscii();
        my_socket->writeDatagram(byteArray,QHostAddress("192.168.1.102"),port);//QHostAddress("192.168.1.102")调用一个临时对象
    }
}
至此,一个简单的Udp通信程序就完成了。程序很简单,代码量也很小,但是却花了我不少的时间。因为大部分时间都在查看QT的英文帮助文档啦。不得不说QT的帮助文档确实做得特别详细,不过这也有一个缺点,就是看起来特别繁琐,经常一个类的介绍还没看完它有让你去看另一个类,这样跳来跳去的简直没完没了,不过这也有一个显而易见的好处,不知不觉中提高了你的英文阅读水平。哈哈,世事就是这样,凡有利必有弊。

你可能感兴趣的:(嵌入式)