Qt Udp聊天室

之前看了《apue》,但是一直没做什么东西,很多概念性的东西了解之后不实践很容易忘掉。所以蹦出写一个聊天室的想法。当然Qt内部有关于Udp和Tcp相关类的封装,任何底层的函数都可以通过直接调用类里的方法完成。我也是参照了《Qt学习之路》这一系列文章做下去的。
先看一下Udp和Tcp什么区别:
Udp是无连接,什么是无连接呢?就是说两台机器如果通信的话不需要事先经过一些约定(连接),可以直接传数据;而有连接的就是说要通信的话必须先连接起来才能传输数据。相比来说:Udp速度快,容错差,安全性低;Tdp速度慢(三次握手),容错高(可以检错重发),安全性高。
不同机器到底是怎么通信的?
这个问题一直是我读网络编程书之前的困惑,网上大部分推荐看《计算机网络》,《Tcp/Ip协议》这类的书。但是那个学习成本太高(但并不意味着不值得看,相反非常值得看),但是对于入门来说,大致了解框架远比抠细节重要。下面我就大致说说两台机器到底如何通信的:
A和B两台机器上面都运行了程序NET,现在A打了一段字(也可能是其他类型的数据)到NET的输入框里,NET通过系统API将这些数据依次往硬件上传(中间依次经历了传输层,网络层,数据链路层),最后到物理层,这之间的层数具体干什么的你不用管,它们的工作其实就是在你的数据开头(或者结尾)加上一些额外信息,这样物理层就能通过这些额外信息知道将你的数据传到哪里去,传多少。等等。这样数据经过光纤,电缆传到B之后,B以相反的顺序依次通过上面说的层将数据送到B的NET程序上显示出来,此时B之间的那些层的功能就是将那些额外信息给去掉,把A的数据给拆解出来送到NET上去。这样就完成了一次数据通信,当然真正的通信肯定比这个更复杂,细节更多,但是作为初学者应该大致了解这个过程就行了。
Qt Udp实现聊天室:
发送端:

    QUdpSocket *udpSocket = new QUdpSocket(this);
    port = 3389;
    udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);//将udpSocket绑定到特定的端口port,这样收发信息都会通过机器的这个端口。当然这个端口必须不被占用。
    QByteArray datagram;
    QDataGram out(&datagram.data(), QIODevice::WriteOnly);
    out << msg1 << msg2;       //msg1和msg2是需要传递的数据,直接"赋"给out,而且msg1 msg2一先一后是有顺序的
    udpSocket->writeDatagram(data, data.length(), QHostAddress::Broadcast, port); //这里QHostAddress::Broadcast可以改为其他IP地址这样就可以给特定的Ip机器发信息了
接收端:
    QUdpSocket *udpSocket = new QUdpSocket(this);
    port = 3389;
    udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);//将udpSocket绑定到特定的端口port,这样收发信息都会通过机器的这个端口。当然这个端口必须不被占用。
    QByteArray datagram;
    QDataGram in(&datagram.data(), QIODevice::ReadOnly); //这里变为读数据
    int >> msg1 >> msg2;       //读数据也是按照先msg1后msg2.这样信息就被读到了msg1和msg2,接下来你就可以对它进行处理了.
Udp里没有服务器和客户端的概念,因为一台机器发送消息的时候可以作为客户端,接收消息的时候可以看做服务器。所以一般为发送端和接收端。当然结合Qt的话应该还要设置udpSocket的SIGNAL和SLOT函数,这样可以实现信息来的时候及时接受。具体的代码就不给了,这里只给QUdpSocket的基本用法.

你可能感兴趣的:(Qt)