10 qt udp编程和网络聊天室的实现

Linux系统编程:
udp 接收端:
socket(AF_INET, SOCK_DGRAM, 0);
bind(..)
recvfrom(…)

udp发送端:
    socket(...)
    sendto(..);    // udp 也可以connect ,但不是连接,仅是指定目标IP,端口号而已
                //    connect后就可以write, send

//

tcp服务端:
    socket(AF_INET, SOCK_STREAM, 0);
    bind(..)
    listen(..)
    accept(..)

tcp客户端:
    socket();
    connect();

udp是无连接,tcp是连接的。
什么是连接, 其实就是与每个客户端有没有需要单独的处理。如在Linux系统编程,udp不管多少个客户端发过来数据,服务端都只调用recvfrom函数就可以,用不着分开客户端来处理。在tcp里,客户端在服务端都是由一个不同的文件描述符来的区分的,在服务端操作不同的文件描述符就意味着与不同的客户端通信。

在QT里, udp和tcp 都封装成类. 其实就是把linux系统的网络编程封装成类.

Udp : QUdpSocket
tcp: QTcpServer, QTcpSocket

udp用法:
1不管是发送端或接收端都需要创建一个QUdpSocket对象(创建对象时,内部会socket());
2 发送端直接调用对象的writeDatagram就可以了, 发出数据后也会有bytesWritten()信号。  
3 接收端还需bind, 然后当有数据需接收处理,会有readyRead()信号,再调用readDatagram接收数据.

Qt里的udp默认就可以支持广播功能,只要往广播地址发送数据即可实现。

利用udp广播实现网络聊天室:

pro工程文件里: QT += gui core widgets network

mywin.h
#ifndef MYWIN_H
#define MYWIN_H
#include <QWidget>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QUdpSocket>
#define PORT  7788
class MyWin : public QWidget
{
    Q_OBJECT
private:
    QTextEdit *txt; //用于显示接收到内容
    QLineEdit *lnd_ip; //用于接收用户发送数据的目标IP
    QLineEdit *lnd_send; //接收要发送的数据
    QLabel    *lbl_ip;
    QLabel    *lbl_send;
    QPushButton *btn_send; //发送按钮
    QHBoxLayout *hlayout;
    QVBoxLayout *vlayout;
    QUdpSocket  *udp;
public:
    explicit MyWin(QWidget *parent = 0);
    ~MyWin();
signals:
public slots:
    void slot_btn();
    void slot_udp_recv();
};
#endif // MYWIN_H
mywin.cpp
#include "mywin.h"
#include <QMessageBox>
#include <QDebug>
MyWin::MyWin(QWidget *parent) : QWidget(parent)
{
    //初始化界面
    txt = new QTextEdit;
    lnd_ip = new QLineEdit("192.168.250.255"); //默认广播地址
    lnd_send = new QLineEdit("hello udp");
    btn_send = new QPushButton("send");
    lbl_ip = new QLabel("ip:");
    lbl_send = new QLabel("text:");
    hlayout = new QHBoxLayout;
    hlayout->addWidget(lbl_ip, 1);
    hlayout->addWidget(lnd_ip, 3);
    hlayout->addWidget(lbl_send, 1);
    hlayout->addWidget(lnd_send, 4);
    hlayout->addWidget(btn_send, 1);
    vlayout = new QVBoxLayout(this);
    vlayout->addWidget(txt, 8);
    vlayout->addLayout(hlayout, 2);
    resize(640, 480);
    ///
    // udp对象初始化
    udp = new QUdpSocket(this);
    if (!udp->bind((PORT)))//绑定端口号
    {
        QMessageBox::critical(this, "error", "bind failed");
        exit(0);
    }
    //连接按钮的单击信号
    connect(btn_send, SIGNAL(clicked(bool)), this, SLOT(slot_btn()));
    // 连接udp对象的readyRead信号
    connect(udp, SIGNAL(readyRead()), this, SLOT(slot_udp_recv()));
}
MyWin::~MyWin()
{
    delete txt;
    delete lnd_ip;
    delete lnd_send;
    delete lbl_ip;
    delete lbl_send;
    delete hlayout;
    delete vlayout;
    delete udp;
}
void MyWin::slot_btn()
{
    //发送数据
    QString str = lnd_send->text();
    QString ip = lnd_ip->text();
    udp->writeDatagram(str.toUtf8(), QHostAddress(ip), PORT); //发出的数据是utf8编码
}
void MyWin::slot_udp_recv()
{
    char *data;
    int ret , len = udp->pendingDatagramSize()+1;
    QHostAddress peer; //用于接收对方的IP地址
    quint16 port;
    QString ip, str("%1[%2]:%3"); //表示此字符是由三个参数组成的
    data = new char[len];
    ret = udp->readDatagram(data, len, &peer, &port); //接收数据,并存放对方的IP地址端口号
    if (ret <= 0)
        return;
    data[ret] = 0; //设尾0
    // ip[port] : data
    // ip地址默认是64位,需转成32位
    ip = QHostAddress(peer.toIPv4Address()).toString(); //用32位的地址创建对象,再获取地址
    str  = str.arg(ip).arg(port).arg(data);
    txt->append(str);
    txt->moveCursor(QTextCursor::End); //自动翻到最后一行
}
main.cpp

#include <QApplication>
#include "mywin.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWin win;
    win.show();
    return a.exec();
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了使用Qt框架实现局域网聊天室,我们可以使用UDP协议进行通信。UDP是一种面向无连接的传输协议,适用于传输不需要高可靠性和有序到达的数据。 首先,我们需要创建一个UDPSocket,并绑定到一个合适的端口。接下来,我们可以使用Qt提供的信号与槽机制来处理接收到的消息。 为了实现聊天室功能,我们需要至少两个应用实例,一个用作服务器,另一个用作客户端。当客户端启动时,它将向服务器发送一个加入聊天室的请求。 当服务器接收到一个加入请求时,它可以将发送者的IP地址和端口存储在一个列表中,以便之后可以将消息广播给所有的聊天室成员。 当一个客户端发送一条消息时,它将将消息发送给服务器,服务器收到消息后,将消息广播给所有已连接的客户端。客户端接收到广播后,可以将消息显示在聊天窗口中。 需要注意的是,UDP是无连接的协议,因此在实现聊天室时,需要处理丢包和乱序的问题。可以使用一些技术,如序列号、心跳检测等来解决这些问题。 此外,为了提高用户体验,我们还可以在聊天室实现一些额外的功能,如私聊、文件传输等。 总之,通过使用QtUDP协议,我们可以很容易地实现一个简单的局域网聊天室。使用UDP协议可以简化通信过程,并提供轻量级的通信方式。不过也要注意到UDP的不可靠性,需要在实现中考虑丢包和乱序问题。 ### 回答2: Qt是一个跨平台的C++应用程序开发框架,可以用于开发各种类型的应用程序,包括局域网聊天室。首先要实现局域网聊天室,需要使用UDP协议进行通信,因为UDP是无连接的、不可靠的传输协议,适合于实时性要求较高的应用。 在Qt中,可以使用QUdpSocket类来实现UDP通信。首先,需要创建一个QUdpSocket对象,并绑定到本地IP和端口上。接下来,可以通过该对象的bind函数将socket绑定到指定的本地IP和端口上。然后,可以使用该对象的readDatagram函数接收其他主机发送过来的消息,并使用writeDatagram函数发送消息给其他主机。 在局域网聊天室中,需要实现多个主机之间的消息传递。可以使用多线程来处理消息接收和发送的操作,以免阻塞主线程。可以创建一个接收线程,通过QUdpSocket来接收其他主机发送的消息,并将接收到的消息发送给主线程进行处理。同时,可以创建一个发送线程,用于向其他主机发送消息。 在主线程中,可以使用Qt的信号和槽机制来处理接收到的消息。当接收线程接收到消息后,可以通过信号将消息传递给主线程,并在主线程中的槽函数中进行处理,例如显示在用户界面上。当用户在界面上输入消息后,可以通过发送线程将消息发送给其他主机。 总结起来,使用Qt的QUdpSocket类可以方便地实现局域网聊天室。通过创建多线程,利用信号和槽机制处理接收和发送的消息,可以实现实时的消息传递。使用UDP协议可以满足聊天室的实时性要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值