C++ 实现一个虚拟聊天软件

C++ 实现一个虚拟聊天软件

本文使用c++和Qt实现一个虚拟的IM聊天软件,实现消息传递,大文件传输,断点续传等功能,主要功能点包括:

  • 用户列表
  • 上下线更新列表
  • 消息喘息
  • *文件传输(支持2GB以上大文件)
  • 多文件同时传输
  • 断点续传

UDP发送/接收消息

项目中所有关于消息的接收与发送均使用UDP进行,包括上线,下线消息,聊天消息,请求发送文件消息,接受方返回确认发送消息,取消文件发送消息等。
UDP消息流程图

1. UDP广播消息

程序启动时,初始化UDP,并发送广播消息,然后在线程中启动UDP监听,c++ UDP监听具体代码如下(监听采用Select模型,避免阻塞):

{
    char buf[1024];  //接收缓冲区
    struct timeval tv;
    fd_set readfds;
    unsigned int n = 0;

    while (true)
    {
        FD_ZERO(&readfds);
        FD_SET(m_sockUdp.sockSrv, &readfds);
        tv.tv_sec = 1;  //设置1s循环
        select(m_sockUdp.sockSrv, &readfds, NULL, NULL, &tv); //使用select模型,recvfrom阻塞
        Message *msgUDP; //申明结构体对象
        if (FD_ISSET(m_sockUdp.sockSrv, &readfds))
        {
            //接收消息
            if ((n = recvfrom(m_sockUdp.sockSrv, buf, sizeof(buf), 0, (SOCKADDR *)&m_sockUdp.sin_from, &m_sockUdp.nAddrLen)) >= 0)
            {
                msgUDP = (Message *)buf;
                switch (msgUDP->messageType)
                {
                    case '0': //处理广播消息
                        broadcastMsg(msgUDP);
                        break;
                    case '1': //收到已登录用户在线消息
                        onlineMsg(msgUDP);  
                        break;
                    case '2': //处理私发消息
                        privateMsg(msgUDP);
                        break;
                    case '3': //接收对方发送文件请求
                        fileMeg(msgUDP);
                        break;
                    case '4': //确认发送,创建线程
                        //启动从len长度开始发送数据
                         QMetaObject::invokeMethod(m_ui, "createSendFileProcess", Qt::QueuedConnection, Q_ARG(QString, QString(QLatin1String(msgUDP->toAddress))),
                                                                                                        Q_ARG(int, 8779), 
                                                                                                        Q_ARG(QString, QString(QString::fromLocal8Bit(msgUDP->fileName))),
                                                                                                        Q_ARG(long long, msgUDP->fileLen),
                                                                                                        Q_ARG(QString, QString(QLatin1String(msgUDP->Md5))));
                        break;
                    case '5': //接收对方取消发送文件消息
                        QString fileMd5 = QString(QLatin1String(msgUDP->Md5));
                        m_ui->mapFileResvProgress[fileMd5]->cancel = true;
                        break;
                }
            }
        }
    }
}

TCP发送/接收文件

后续更新

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
虚拟摄像头是一种软件技术,可以模拟摄像头功能,使计算机和其他设备能够进行视频通信或视频录制。与实际摄像头不同,虚拟摄像头并不需要物理设备,而是通过软件的方式来实现摄像头的功能。 虚拟摄像头工作原理如下:首先,软件会通过采集计算机屏幕上的图像,并将图像作为视频流输出。其次,虚拟摄像头将这个输出的视频流作为虚拟摄像头设备的输入源,从而可以像真实摄像头一样被其他应用程序所识别和使用。 虚拟摄像头的应用非常广泛。例如,它可以用于视频会议软件,使用户可以通过计算机摄像头进行远程视频通话。另外,虚拟摄像头还可以用于视频录制软件,用户可以通过虚拟摄像头将电脑屏幕上的操作录制成视频并保存。此外,虚拟摄像头还可以在游戏直播等应用中发挥作用,将游戏画面实时传输到网络上。 虚拟摄像头的实现需要利用视频采集、图像处理和数据传输等技术。通过编写相应的软件程序,能够将这些技术相结合,实现虚拟摄像头的功能。 总结来说,虚拟摄像头是一种通过软件技术实现的摄像头功能。它可以模拟实际摄像头的工作原理,将计算机屏幕上的图像作为视频流输出,使得计算机和其他设备可以进行视频通信或视频录制。在各种应用场景中,虚拟摄像头都发挥着重要的作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值