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界面
myeclipse输出:
直接放代码,注释在代码中:
本文的所有工程源码在资源中,可以下载参考: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