最新公告
  • 欢迎您光临小酒资源吧,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • QT开发TCP协议的通信软件

    QT开发TCP协议的通信软件 最后编辑:2020-09-09
    增值服务: 自动发货 使用说明 安装指导 环境配置二次开发BUG修复

    大二课设课程结束了,来总结一下这次的实战QT开发。虽然代码不精致,但是也是笔者一个月的成果。喜欢的来看啊
    先上两张本地测试的图片
    首先是客户端

    QQ图片20191210204614.png

    然后是服务端

    QQ图片20191210204543.png

    然后接下来是效果图,服务端跟客户端放在一张图里了,图标取自网络,如有侵权,联系笔者。

    QQ图片20191210204719.png

    然后接下来是测试图,时间紧迫,客户端只设置了一个账号,输入账号密码之后进入到此界面

    QQ图片20191210205641.png

    好了,这些是我们小组的项目。写起来也很简单啊,采用QT开发C++语言。

    QT开发的这种软件还是相对比较简单的啊。记录一下代码:客户端采用了QT提供的信号与槽,对各种点击事件发出信号,代码段做出反应。客户端的对话框代码段对信息文本的处理,来判断服务器转发的信息与自己的信息来做出不同的文本显示:[C++] 纯文本查看 复制代码void qtchatmessage::paintEvent(QPaintEvent *) //画家
    {
    QPainter painter(this); //画家
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);//消锯齿
    painter.setPen(Qt::NoPen); //画笔
    painter.setBrush(QBrush(Qt::gray)); //画刷

    if(m_userType == User_Type::User_He) { // 用户
    //头像
    painter.drawPixmap(m_iconLeftRect, m_leftPixmap);

    //框加边
    QColor col_KuangB(234, 234, 234);
    painter.setBrush(QBrush(col_KuangB));
    painter.drawRoundedRect(m_kuangLeftRect.x()-1,m_kuangLeftRect.y()-1,m_kuangLeftRect.width()+2,m_kuangLeftRect.height()+2,4,4);
    //框
    QColor col_Kuang(255,255,255);
    painter.setBrush(QBrush(col_Kuang));
    painter.drawRoundedRect(m_kuangLeftRect,4,4);

    //三角
    QPointF points[3] = {
    QPointF(m_sanjiaoLeftRect.x(), 30),
    QPointF(m_sanjiaoLeftRect.x()+m_sanjiaoLeftRect.width(), 25),
    QPointF(m_sanjiaoLeftRect.x()+m_sanjiaoLeftRect.width(), 35),
    };
    QPen pen;
    pen.setColor(col_Kuang);
    painter.setPen(pen);
    painter.drawPolygon(points, 3);

    //三角加边
    QPen penSanJiaoBian;
    penSanJiaoBian.setColor(col_KuangB);
    painter.setPen(penSanJiaoBian);
    painter.drawLine(QPointF(m_sanjiaoLeftRect.x() – 1, 30), QPointF(m_sanjiaoLeftRect.x()+m_sanjiaoLeftRect.width(), 24));
    painter.drawLine(QPointF(m_sanjiaoLeftRect.x() – 1, 30), QPointF(m_sanjiaoLeftRect.x()+m_sanjiaoLeftRect.width(), 36));

    //内容
    QPen penText;
    penText.setColor(QColor(51,51,51));
    painter.setPen(penText);
    QTextOption option(Qt::AlignLeft | Qt::AlignVCenter);
    option.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
    painter.setFont(this->font());
    painter.drawText(m_textLeftRect, m_msg,option);
    } else if(m_userType == User_Type::User_Me) { // 自己
    //头像
    painter.drawPixmap(m_iconRightRect, m_rightPixmap); //画头像加头像的框架。框加图

    //框
    QColor col_Kuang(75,164,242); //颜料
    painter.setBrush(QBrush(col_Kuang)); //设置画刷,参数为颜色
    painter.drawRoundedRect(m_kuangRightRect,4,4); //画给定矩形框的圆角

    //三角
    QPointF points[3] = {
    QPointF(m_sanjiaoRightRect.x()+m_sanjiaoRightRect.width(), 30), //给定的坐标构造点
    QPointF(m_sanjiaoRightRect.x(), 25),
    QPointF(m_sanjiaoRightRect.x(), 35),
    };
    QPen pen; //画笔
    pen.setColor(col_Kuang);
    painter.setPen(pen); //把pen给painter
    painter.drawPolygon(points, 3); //绘制数组中的这三个点

    //内容
    QPen penText; //创建画笔
    penText.setColor(Qt::white);
    painter.setPen(penText); //笔给画家
    QTextOption option(Qt::AlignLeft | Qt::AlignVCenter); //选项 左和水平居中
    option.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); //设置换行模式
    painter.setFont(this->font()); //为画家选择字体
    painter.drawText(m_textRightRect,m_msg,option); //往矩形框中按照option画入m_msg文本
    }
    }

    接下来是客户端的送槽函数,用来获取输入的文本,对文本向绘图事件虚函数传递参数,然后向对话框显示文本。
    [C++] 纯文本查看 复制代码void aWidget::on_pushButton_clicked() //发送按钮的槽函数
    {
    QString str = ui->textEdit_2->toPlainText(); //获取发送区的内容
    if(str == "")return;
    tcpsocket->write(str.toUtf8().data()); //利用通信套接字向发送缓冲区写入数据
    ui->textEdit_2->clear(); //清空发送区
    qtchatmessage* messageW = new qtchatmessage(ui->listWidget->parentWidget()); //创建气泡
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget); //创建小部件,选项控件
    dealMessage(messageW, item, str, qtchatmessage::User_Me); //处理创建的气泡
    ui->listWidget->setCurrentRow(ui->listWidget->count()-1); //移动到最后一行
    }

    然后客户端设置事件过滤器,来过滤键盘操作,设置快捷键回车来点击发送按钮
    [C++] 纯文本查看 复制代码bool aWidget::eventFilter(QObject *target, QEvent *event){ //事件过滤器,不设置事件过滤器会被系统的函数自动过滤
    if(target == ui->textEdit_2)
    {
    if(event->type() == QEvent::KeyPress) //按键盘事件
    {
    QKeyEvent *k = static_cast<QKeyEvent *>(event);
    if(k->key() == Qt::Key_Return||k->key() == Qt::Key_Enter) //回车
    {
    aWidget::on_pushButton_clicked();
    return true;
    }
    }
    }
    return QWidget::eventFilter(target,event);
    }

    接受函数采用QT提供的虚函数接受消息处理
    [C++] 纯文本查看 复制代码connect(tcpsocket, &QTcpSocket::readyRead,
    [=]()
    {
    QByteArray str = tcpsocket->readAll(); //获取对方发送的数据
    QString string = static_cast<QString>(str); //强转
    if(record[0] == \’n\’){
    if(string == "yes"){record[0] = \’y\’; w1.hide();this->show();}else return;
    }
    qtchatmessage* messageW = new qtchatmessage(ui->listWidget->parentWidget()); //创建气泡
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget); //创建小部件,选项控件
    dealMessage(messageW, item, str, qtchatmessage::User_He); //处理创建的气泡
    ui->listWidget->setCurrentRow(ui->listWidget->count()-1); //移动到最后一行
    } ); //接受数据

    客户端大致就这些。接下来总结一下服务端:
    变量列表:[C++] 纯文本查看 复制代码QTcpServer *tcpserver;
    QTcpSocket *tcpsocket[13];
    char flag[13]; //判断是否连接
    char record[13]; //判断是否登录
    void initMumber();
    void initMumber_1();
    void dealConnect();
    void dealMessage(int i);
    void dealRecord(int i); //处理登录

    创建了十三个通信套接字,一个监听套接字。标志位变量。首先初始化各变量,包括监听套接字。
    [C++] 纯文本查看 复制代码void aWidget::initMumber(){
    tcpserver = new QTcpServer(this);
    tcpserver->listen(QHostAddress::Any, 6666);
    aWidget::initMumber_1();
    }

    void aWidget::initMumber_1(){
    for(int j = 0;j<13;j++){
    flag[j] = \’n\’;
    record[j] = \’n\’;
    tcpsocket[j] = nullptr;
    }
    }

    服务端的监听套接字,监听新连接,触发信号调用处理函数,设置标志位变量为已连接。
    [C++] 纯文本查看 复制代码void aWidget::dealConnect(){ //处理连接
    for(int i = 0;i < 13;i++){
    if(flag[i] == \’n\’){
    flag[i] = \’y\’;
    tcpsocket[i] = tcpserver->nextPendingConnection(); //连接客户端
    QString ip = tcpsocket[i]->peerAddress().toString(); //打印信息
    quint16 port = tcpsocket[i]->peerPort();
    QString temp = QString("[%1:%2]:接入服务").arg(ip).arg(port);
    ui->textEdit->append(temp); //向服务器显示连接信息
    connect(tcpsocket[i], &QTcpSocket::readyRead,[=](){aWidget::dealMessage(i);}); //监听是否来信息 //dealMessage函数的参数必须传局部变量,不能传全局变量。
    break; //必须有break,否则会把通信套接字循环完的。 //随着i的变化Lambda表达式的函数体随着变化
    }
    }
    int b; //不能写进for里面,因为有的退出了,套接字就不能用了
    for (b = 0;b < 13;b++) {
    if(flag[b] == \’n\’)break;
    }
    if(b == 13)
    ui->textEdit->append("已经没有可用的套接字了");

    }

    入监听接受信息函数来分发信息,达到服务器转发信息的目的
    [C++] 纯文本查看 复制代码void aWidget::dealMessage(int i){ //把消息分发给所有在线客户
    if(record[i] == \’n\’){
    aWidget::dealRecord(i);
    return;
    }
    QByteArray array = tcpsocket[i]->readAll(); //获取内容
    for(int j = 0;j<13;j++)
    {
    if(flag[j] != \’n\’&&i != j)
    {
    tcpsocket[j]->write(array);
    }
    }
    }

    基本上TCP通信采用QT开发的基本流程就这些,还有一些细节的处理,项目中对气泡的处理参考了一下网络上的代码。其他调用函数我没写进去,需要的小伙伴说一声,我抽空上传到百度网盘。由于项目代码中涉及到一些隐私就没全部上传,所有的图片均取自于网络,如有侵权,联系笔者,立刻删除。新人第一次发帖,大家多多照顾。目前大二小菜鸟,希望和大家共同进步。加油啦~。

    代码如果哪里有问题,大佬勿喷,笔者还是大二在校生。联系笔者,一定跟大家交流,共同进步。

    要乖,那些错过的,咱们不要了。

    猜你在找

    1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!603313839@qq.com
    2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
    3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
    4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!

    小酒资源吧 » QT开发TCP协议的通信软件

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    免责声明/技术服务/售后服务等
    本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!603313839@qq.com
    • 2020-09-09Hi,初次和大家见面了,请多关照!

    售后服务:

    • 售后服务范围 1、商业模板使用范围内问题免费咨询
      2、源码安装、模板安装(一般 ¥50-300)服务答疑仅限SVIP用户
      3、单价超过500元的程序/模板免费一次安装,需提你供服务器信息。
      付费增值服务 1、提供dedecms模板、WordPress主题、discuz模板优化等服务请详询在线客服
      2、承接 WordPress、DedeCMS、Discuz 等系统建站、仿站、开发、火车头规则、定制等服务
      3、服务器环境配置(一般 ¥50-300)
      4、网站中毒处理(需额外付费,500元/次/质保三个月)
      售后服务时间 周一至周日(法定节假日除外) 9:00-22:00
      免责声明 本站所提供的模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: 603313839@qq.com),我们会及时删除,给您带来的不便,我们深表歉意!

    Hi, 如果你对这款程序/模板/下载/有疑问,可以跟我联系哦!

    联系作者
    • 3161会员总数(位)
    • 4504资源总数(个)
    • 4本周发布(个)
    • 0 今日发布(个)
    • 407稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
  • 2020 XiaoJiu8.cn - & WordPress Theme. All rights reserved 黔ICP备17003460号-5

  • XML地图 | 站长导航
         
    升级SVIP尊享更多特权立即升级