⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dialog.cpp

📁 Qt中的网络编程的收数据的客户端
💻 CPP
字号:
#include <QtGui>
#include <QtNetwork>
#include <QFile>
#include <QDir>
#include <stdlib.h>
#include "dialog.h"


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
     tcpSocket = new QTcpSocket(this);
    
     timer1=new QTimer(this);
     //timer2=new QTimer(this);
    
     serverLabel = new QLabel(QString::fromLocal8Bit("服务器ip:"));
     ipInfoLabel = new QLabel(QString::fromLocal8Bit("服务器port:"));
     sqlipLabel = new QLabel(QString::fromLocal8Bit("数据库ip:"));
     databaseLabel = new QLabel(QString::fromLocal8Bit("数据库名:"));
     sqluserLabel = new QLabel(QString::fromLocal8Bit("用户名:"));
     sqlpassLabel = new QLabel(QString::fromLocal8Bit("数据库密码:"));
     startdateLabel = new QLabel(QString::fromLocal8Bit("开始日期:"));
     starttimeLabel = new QLabel(QString::fromLocal8Bit("开始时间:"));

     ComboBox = new QComboBox;
     
     ComboBox->addItem(tr("local"));
     ComboBox->addItem(tr("center"));
     ComboBox->addItem(tr("liantong"));
     ComboBox->addItem(tr("yidong"));
     
     ipInfoLineEdit = new QLineEdit(tr("hj"));
     sqlipLineEdit = new QLineEdit(tr("hj"));
     databaseLineEdit = new QLineEdit(tr("hj"));
     sqluserLineEdit = new QLineEdit(tr("hj"));
     sqlpassLineEdit = new QLineEdit(tr("hj"));
     startdateLineEdit=new QLineEdit(QDate::currentDate().toString("yyyy.MM.dd"));
     starttimeLineEdit=new QLineEdit(QTime::currentTime().toString("h:m:s"));

     sqlpassLineEdit->setEchoMode(QLineEdit::Password);
     
    // hostLineEdit->setReadOnly(true);
    // portLineEdit->setReadOnly(true);
     startdateLineEdit->setReadOnly(true);
     starttimeLineEdit->setReadOnly(true);
     //display.setReadOnly(true);

     beginButton = new QPushButton(tr("Begin"));
     beginButton->setDefault(true);
     beginButton->setEnabled(true);

     quitButton = new QPushButton(tr("Quit"));

     buttonBox = new QDialogButtonBox;
     buttonBox->addButton(beginButton, QDialogButtonBox::ActionRole);
     buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);

     connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
     connect(beginButton,SIGNAL(clicked()), this, SLOT(begin()));
     connect(timer1, SIGNAL(timeout()), this, SLOT(sendFortune())); //设置发送数据报的大小
     //connect(timer2, SIGNAL(timeout()), this, SLOT(copy()));
     
     QGridLayout *mainLayout = new QGridLayout;
    
     mainLayout->addWidget(serverLabel, 0, 0);
     mainLayout->addWidget(ComboBox, 0, 1);
     mainLayout->addWidget(ipInfoLabel, 0, 2);
     mainLayout->addWidget(ipInfoLineEdit, 0, 3);
     mainLayout->addWidget(sqlipLabel, 1, 0);
     mainLayout->addWidget(sqlipLineEdit, 1, 1);
     mainLayout->addWidget(databaseLabel,1,2);
     mainLayout->addWidget(databaseLineEdit,1,3);
     mainLayout->addWidget(sqluserLabel,2,0);
     mainLayout->addWidget(sqluserLineEdit,2,1);
     mainLayout->addWidget(sqlpassLabel,2,2);
     mainLayout->addWidget(sqlpassLineEdit,2,3);
     mainLayout->addWidget(startdateLabel,3,0);
     mainLayout->addWidget(startdateLineEdit,3,1);
     mainLayout->addWidget(starttimeLabel,3,2);
     mainLayout->addWidget(starttimeLineEdit,3,3);
     mainLayout->addWidget(&display,4,0,20,4);
     mainLayout->addWidget(buttonBox,24,0,1,4); 
     
     setLayout(mainLayout);
     setWindowTitle(tr("Client_sendDataToCenter"));
   
}


void Dialog::begin()
{
		
  //创建日志文件夹
  filepath = dir.currentPath();

  if(!filepath.contains("log_center_send"))	
   {	
    dir.mkdir("log_center_send");
    filepath += "/log_center_send/";
    dir.setCurrent(filepath);
   }
	dir.cdUp();
	
	//连接数据库,用户名和密码从界面上填入获得
  db = QSqlDatabase::addDatabase("QSQLITE"); // 使用sqlserver数据库驱动    
  db.setDatabaseName("E:/sqlite/oracle.db"); // 之前建立的数据库名
	if(!db.open())
	{
		// 打开数据库失败,显示错误原因
   display.append("cannot open database.");
   display.append("Reason: " + db.lastError().databaseText());
	}

	getip(); //获得ip
	 
	 
	tcpSocket->connectToHost(host,port);
	if(tcpSocket->waitForConnected(5000)==false)
     {  
      display.append("Failed to connect the server!!");
      return;
     }
  
  	  //和服务器交互信息
  QByteArray block("IamOracleR"); //请求数据包格式
	tcpSocket->write(block);
  if(tcpSocket->waitForBytesWritten()==false)
   {   
        display.append("Failed to communicate with  the server!");
        return;
   }
  
  timer1->start(100);
  
  numflag=0;
 
 
	display.append("The client is working now!!");
	 
 }

void Dialog::getip()
   {
    QSqlQuery queryip;
    QSqlError errorip;
    queryip.prepare("select * from ipInfo where servername=:name ");
    queryip.bindValue(":name",ComboBox->currentText());  
    if(queryip.exec())
      {
       queryip.first();
       //对port和host赋值
       port=queryip.value(2).toInt();
       host=queryip.value(1).toString();
       ipInfoLineEdit->setText(host+" "+queryip.value(2).toString());
     }
     else
       {
         //如果查询失败,显示错误
        errorip= queryip.lastError(); 
        display.append("From sqlite database,the ipInfo table: " + errorip.databaseText());
       }
    }

void Dialog::sendFortune()
	{
    timer1->stop();
	
	  if((++numflag)==1000)     //标志位符合条件则备份
      {
    		display.append("here");
    		copy();
     		numflag=0;
    	}
    
	QByteArray data; //数据库中包含的输出字段 
    
    QSqlQuery query;
    QSqlError error; 
    int numRows,temp;
    if(query.exec("select * from tempOracle where flag='f' "))
      {  
         // 询问数据库驱动,是否驱动含有记录影响行数的特性
       if(db.driver()->hasFeature(QSqlDriver::QuerySize))
        {
          numRows = query.size(); // 如果支持结果影响的行数,那么直接记录下来
        } 
        else
        {
          query.last();           //否则定位到结果最后
          numRows = query.at() + 1;
        }
       query.first();
       if(numRows==-1)
       	{
       		timer1->start(100);
       		return;
       	}
       else
        { 
          do
            {
             //依次取出数据,并存于字符串数组中
             data=query.value(1).toByteArray()+query.value(0).toByteArray();  
            
             fortune[query.at()].clear();
             fortune[query.at()]=data; //设置类型,包类型(1字节)+socket号(2字节)+数据
             
             display.append(query.value(0).toString());
             //对于已充值成功的记录,改变发送标志位
             QSqlQuery queryupdate;
			 queryupdate.prepare("update tempOracle set flag='t' where data=:da");
			 queryupdate.bindValue(":da",query.value(0));
             if(!queryupdate.exec())
              {
                QSqlError errorup = queryupdate.lastError(); 
                display.append("Failed to change the sendflag!Reason:"+errorup.databaseText());
                log("Failed to change the sendflag"+fortune[query.at()]);             
              }
             temp=query.at();
             }
           while(query.next()&&temp<4);
        }     
      }
     else
      {
        //如果查询失败,发出错误信号
        error= query.lastError(); 
        display.append("From sqlite database,the handled table: " + error.databaseText());
        timer1->start(100);
        return;
      }
     
     QByteArray string;
	 QString tempstring;
     int i,j,fortunelen[5];
     for(i=0;i<=4;i++)
       {
     	 fortunelen[i]=fortune[i].size();
		 string+=fortune[i];
       }
     
	 for(i=0;i<5;i++)
		{
	       tempstring=QString("%1").arg(fortunelen[i]);
		   int b=tempstring.size();
		   for(j=0;j<4-b;j++)
			{
		     tempstring="0"+tempstring;
			}
		   
		   string+=tempstring.toLocal8Bit();
		   fortune[i].clear();
		}
	 tcpSocket->write(string);
     display.append("send"+string);
     
     if(tcpSocket->waitForBytesWritten()==false)
       {   
         display.append("Failed to send the data to center");
         log("Failed to send the data to center"+string);
         return;
       }
     
     string.clear();
     
     timer1->start(100);
     
	}

 
void Dialog::copy()
	{
      int nums=0;
      display.append("copy");
      QSqlQuery querycopy;
      QByteArray data1;
      if(querycopy.exec("select * from tempOracle where flag='t'"))
      {  
         // 询问数据库驱动,是否驱动含有记录影响行数的特性
        if(db.driver()->hasFeature(QSqlDriver::QuerySize))
        {
          nums = querycopy.size(); // 如果支持结果影响的行数,那么直接记录下来
        } 
        else
        {
          querycopy.last();           //否则定位到结果最后
          nums= querycopy.at() + 1;
        }
       querycopy.first();
       if(nums==-1)
       	{
           display.append("No data in the handled table,and cann`t copy");
      		 return;
	   }
	   else
	   {   
		 do
	     {
        //依次取出数据,并存于字符串数组中
         data1=querycopy.value(0).toByteArray();  
 	       
	     QSqlQuery queryinsert;
	     queryinsert.prepare("insert into copyTempOracle(data) values (:da1)");
	     queryinsert.bindValue(":da1",(QString)data1);
	     if(!queryinsert.exec())
          {
            QSqlError errorinsert;
            errorinsert = queryinsert.lastError(); 
            display.append("Failed to copy the data.Reason:"+errorinsert.databaseText());
            log("Failed to copy"+data1);
          }
	       
	     QSqlQuery querydelete;
	     querydelete.prepare("delete from tempOracle where data=:dat and flag='t'");
         querydelete.bindValue(":dat",querycopy.value(0).toString());
         if(!querydelete.exec())
          {
            QSqlError errordelete;
            errordelete = querydelete.lastError(); 
            display.append("Failed to delete the data after copy.Reason:"+errordelete.databaseText());
            log("Failed to delete from the handled."+data1);
          }
	     }
	     while(querycopy.next());
	   }
	 }
	  else
	  {
	      QSqlError errorcopy=querycopy.lastError();
		  display.append("Failed to query the handled table.Reason:"+errorcopy.databaseText());
      }
 	}
		
 void Dialog::log(QByteArray fortune)
 	 {
 	   QFile file(QString::fromLocal8Bit("%1.txt").arg(QString::fromLocal8Bit(fortune)));
       file.open(QIODevice::WriteOnly);
       QTextStream log(&file); 
       log <<QString::fromLocal8Bit(fortune);
 	 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -