热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QT前台与后台程序通过socket通信

本文转自:http:blog.chinaunix.netu3103866showart_2099036.html  通常情况下在linux上写程序不需要GUI进行展示,但有时做测试

本文转自:http://blog.chinaunix.net/u3/103866/showart_2099036.html  

 

通常情况下在linux上写程序不需要GUI进行展示,但有时做测试还是有个前台界面更加方便,省去了很多繁琐的输入过程,同时也更易于观察输出内容。因此这两天开始回顾了一下QT的东西。做为基础的功能,首先做了个QT和后台进程(c语言实现)交互的模块,在此基础上今后再针对具体需求做些修改便可完成前后台之间的配合。因为QT本身是跨平台的框架,因此以后前端程序移植到其他平台依然能很好的运行。

QT前台:  window下客户端, 通过执行ip和端口发送字符串并等待接收。使用QT提供的对socket封装过
         的类QTcpSocket和相关函数

后台进程: 虚拟机linux上c语言实现,通过系统的socket函数接收字符串,并将字符串中的小写字符转换为大
         写,并返回给客户端。

QT前台截图:
《QT前台与后台程序通过socket通信》

后台截图:
《QT前台与后台程序通过socket通信》

前台代码:

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::Dialog)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket( this );
    ui->lineEdit->setText("192.168.244.66");
    ui->lineEdit_2->setText( "2010" );

    connect( tcpSocket, SIGNAL(error(int)), this, SLOT(errMsg(int)) );
    connect( ui->pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked(bool)) );
    connect( tcpSocket, SIGNAL(readyRead()), this, SLOT(recvMsg()) );
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked(bool checked)
{
        QString port;
        int port_Int;

        port = ui->lineEdit_2->text();
        port_Int = port.toInt();

        tcpSocket->connectToHost(QHostAddress(ui->lineEdit->text()), port_Int);

         //waitForConnected的参数是超时时间

        if (!tcpSocket->waitForConnected(2)) {
            tcpSocket->disconnectFromHost();
            return;
        }
        QTextStream out(tcpSocket);
        out << ui->lineEdit_3->text()<< endl;
}

void Dialog::recvMsg()
{

    QString res;

    res += tcpSocket->readAll();
    ui->textEdit->setText(res);
    ui->textEdit->moveCursor(QTextCursor::End);

    tcpSocket->disconnectFromHost();
}

void Dialog::errMsg( int errNo )
{
   qWarning( "this is err!!!!" );
}

后台代码:

#include 
#include 
#include 
#include 
#include 

#define RCV_BUF_LEN 200

int main( int ac, char **av )
{
        int sock;
        int client_Sock;
        int ret;
        char inputBuf[200];
        char recvBuf[RCV_BUF_LEN];
        struct sockaddr_in svrAddr;
        int i;
        int val;

        /** 创建监听套接字 **/
        if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
                printf("socket error!/n");
                return -1;
        }

        /** 指定监听端口和地址 **/
        memset( &svrAddr, 0x00, sizeof(svrAddr) );
        svrAddr.sin_family =AF_INET;
        svrAddr.sin_addr.s_addr = htonl( INADDR_ANY );
        svrAddr.sin_port = htons( 2010 );

        setsockopt(sock,SOL_SOCKET,SO_REUSEADDR, (char *)&val, sizeof(val) );

        /** 绑定监听套接字和端口 **/
        if ( bind(sock, (struct sockaddr *)&svrAddr, sizeof(svrAddr)) != 0 ){
                printf("bind error!/n");
                return -1;
        }

        /** 监听套接字 */
        if ( listen( sock, 10 ) != 0 ){
                printf("listen error!/n");
                return -1;
        }

        while( 1 ){
                /** 等待连接请求 **/
                printf("等待客户端连接请求../n");
                if ( (client_Sock = accept( sock, NULL, 0 )) < 0 ){
                        printf("accept error!/n");
                        return -1;
                }

                printf("客户端已连入../n");

                while( 1 ){
                        memset( recvBuf, 0x00, RCV_BUF_LEN );
                        ret = recv( client_Sock, recvBuf, RCV_BUF_LEN, 0 );
                        recvBuf[strlen(recvBuf) - 1] = 0;
                        if ( ret > 0 ){
                                printf("接收到: [%s]/n", recvBuf);
                                for( i = 0; i < strlen(recvBuf); i++ ){
                                        if ( recvBuf[i] > 96 && recvBuf[i] < 123 ){
                                                recvBuf[i] -= 32;
                                        }
                                }

                                ret = send( client_Sock, recvBuf, strlen(recvBuf), 0 );
                                if ( ret > 0 ){
                                        printf("处理并返回成功../n");
                                }
                                else if ( ret < 0 ){
                                        printf("返回客户端错误../n");
                                }
                        }
                        else if ( ret == 0 ){
                                printf("客户端断开../n");
                                break;
                        }
                        else{
                                printf("rcv error!/n");
                                break;
                        }
                }

        }

        return 0;
}


推荐阅读
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 在将Web服务器和MySQL服务器分离的情况下,是否需要在Web服务器上安装MySQL?如果安装了MySQL,如何解决PHP连接MySQL服务器时出现的连接失败问题? ... [详细]
  • 本文旨在探讨信息安全专业的职业规划路径,结合个人经历和专家建议,为即将毕业的学生提供实用的指导。 ... [详细]
  • 数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇
    数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇,Go语言社区,Golang程序员人脉社 ... [详细]
  • 【妙】bug称它为数组越界的妙用
    1、聊一聊首先跟大家推荐一首非常温柔的歌曲,跑步的常听。本文主要把自己对C语言中柔性数组、零数组等等的理解分享给大家,并聊聊如何构建一种统一化的学习思想 ... [详细]
  • 过去查询Mysql的时候,都见3306对所有端口开放着,感觉不安全。netstat&nbsp;-anlp&nbsp;|&nbsp;grep&nbsp;mysqltcp&nbsp;0&am ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
author-avatar
告非言普
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有