Qt与Tomcat服务器通信实例 post方法提交

时间:2021-06-11 16:52:59

1. 利用Qt 网络类:

 QNetworkAccessManager 、QNetworkReply、 QNetworkRequest

2. 要知道的知识:

每一种语言在实现网络接口的时候,都会有自己的实现类。而我们又知道网络协议一般来说分为7层,所有的应用都是建立在此基础之上,它们是标准协议,每一种语言都通用且必须严格遵守。举例说明,譬如socket工作在传输层,Http中的post/get工作在应用层。所以我们可以得出这样的结论:无论java、c、c++、Qt 或者其他语言,只要他们实现了socket、http,那么一定可以实现数据通信。本文章将实例讲解 Qt的http类与Tomcat服务器中的java servelt类之间的数据通信。

提示:本实例仅为测试通信,界面一个按钮,一个文本框(暂时无用,待完善)。Qt提交数据,tomcat中java类接收输出

运行结果:(本实验用的交叉编译器,linux下实验过成功运行)

Qt界面

Qt与Tomcat服务器通信实例 post方法提交

myeclipse输出:

Qt与Tomcat服务器通信实例 post方法提交


直接放代码,注释在代码中:

本文的所有工程源码在资源中,可以下载参考:http://download.csdn.net/detail/guomutian911/7115883

Qt代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QtGui>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QtNetwork>


namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QString str;

public:
   // QPushButton* pushButton;

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *nam;
    QNetworkReply *reply;

public slots:
    void push();

};



#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    nam(new QNetworkAccessManager(this)),   //必须有,要不执行一次出错
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(push())); //连接信号、槽




}

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

void MainWindow::push()
{
    qDebug() << "hello world";
    
    QUrl url("http://192.168.1.100:8080/myhttp/LoginAction");  //服务器端servelt接收地址
    QNetworkRequest req;
        req.setUrl(QUrl(url));
        req.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); //此句交叉编译时必须有,否则报错
        
   
    QByteArray append("username=admin&password=123456");  //定义字符串
    QNetworkReply *reply = nam->post(req, append);        //以post方式发送数据


}


服务器端myeclipse中代码:(注释内容较多,此代码在原来项目中修改,可以忽略)

package guo;
/*服务器端    收发
 * request  收
 * response 发
 * */
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//继承HttpServlet,为了生成HttpServletRequest、HttpServletResponse对象
public class LoginAction extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
    response.setContentType("text/html;charset=utf-8");//设置应答内容,字体编码
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    
  //PrintWriter 基于字符的输出流,可以输出字符或字符串整型等数据。输出的目标可以是磁盘文件、其他输出流
  //从response获得字符流 ,out由web容器创建
    PrintWriter out = response.getWriter();
    
    String username = request.getParameter("username");//获取请求参数
    String password = request.getParameter("password");
            
    //判断用户名密码是否正确
    /*if(username.equals("admin") && password.equals("123")) {
        out.print("Login succeeded!");//给输出目标输出字符信息
    	//out.print("用户名"+username);
    }else {
        out.print("Login failed!");
    }*/
    out.print(username);
    out.print(password);
    System.out.println(username);
    System.out.println(password);
    out.flush();//清除字符流缓存
    out.close();//关闭字符流
}
	}

作者参考博文:

1.http://blog.csdn.net/chenlong12580/article/details/7393563

2.http://blog.csdn.net/ultimater/article/details/8762237