Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)
目录
背景
演示
搭建Java Web环境
QTcpSocket获取服务器数据
QNetworkAccessManager获取服务器数据
背景
Qt中有2个方式可以实现HTTP协议的发送,一个是使用QNetworkAccessManager,这个是非常常见的,另外是使用QTcpSocket自己构造HTTP格式,也是可以的。
演示
web程序运行如下:
输入10086后:
使用telnet获取web网站数据:
发送命令以及接收如下:
使用QNetworkAccessManager获取服务器数据:
使用QTcpSocket获取数据:
搭建Java Web环境
java源码结构如下:
源码如下:
DataSource.java
package my;import java.util.ArrayList;public class DataSource {ArrayList<Record> m_records = new ArrayList<Record>();public DataSource(){m_records.add(new Record("XiaoMing", "10086"));m_records.add(new Record("XiaoHong", "10087"));m_records.add(new Record("XiaoGang", "10088"));}public Record query(String qq){for(Record e : m_records){if(e.qq.equals(qq)){return e;}}return null;}public class Record {public String name = "";public String qq = "0000";public Record(String name, String qq){this.name = name;this.qq = qq;}}
}
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form method="get" action="query.jsp" >输入QQ号<input type="text" name="qq" /> <input type="submit" value="提交" /></form></body>
</html>
query.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'query.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%@ page import="my.*" %><%String qq = request.getParameter("qq");DataSource db = new DataSource();DataSource.Record result = db.query(qq);if(result == null){out.print("<p> 不存在此记录 </p> ");} else{out.print("<p> 姓名: " + result.name + ", QQ: " + result.qq + "</p>");}%></body>
</html>
QTcpSocket获取服务器数据
程序结构如下:
widget.ui如下:
源码:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
class QTcpSocket;
QT_END_NAMESPACEnamespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();protected slots:void btnClicked();void onConnect();void onReadyRead();private:Ui::Widget *ui;QTcpSocket *m_socket;
};#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QTcpSocket>
#include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("QTcpSocket");m_socket = new QTcpSocket(this);connect(m_socket, SIGNAL(connected()), this, SLOT(onConnect()));connect(m_socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(btnClicked()));
}Widget::~Widget()
{delete ui;
}void Widget::btnClicked()
{m_socket->connectToHost("47.101.40.99", 8080);
}void Widget::onConnect()
{m_socket->write("GET /GetPostDemo/query.jsp?qq=10086\r\n""Host: 47.101.40.99\r\n\r\n");
}void Widget::onReadyRead()
{qDebug() << QString::fromUtf8(m_socket->readAll());
}
QNetworkAccessManager获取服务器数据
程序结构如下:
widget.ui是这样的:
源码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
class QNetworkAccessManager;
class QNetworkReply;
QT_END_NAMESPACEnamespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void btnClicked();void replyFinished(QNetworkReply *reply);private:Ui::Widget *ui;QNetworkAccessManager *m_manager;
};#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("QNetworkAccessManager");m_manager = new QNetworkAccessManager(this);connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(btnClicked()));connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}Widget::~Widget()
{delete ui;
}void Widget::btnClicked()
{m_manager->get(QNetworkRequest(QUrl("http://47.101.40.99:8080/GetPostDemo/query.jsp?qq=10086")));
}void Widget::replyFinished(QNetworkReply *reply)
{qDebug() << QString::fromUtf8(reply->readAll());
}
Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)相关推荐
- Qt创建线程两种方式的区别
使用QT创建线程有两种方式,方式A使用moveToThread,方式B是直接继承QThread.差异主要在于方式A的槽函数将会在新线程中运行,而方式B的槽函数在旧线程中运行. 结论如下: PS:旧线程 ...
- Qt工作笔记-三种方式解决Qt5中文编码问题
目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用. 把这三种方法顺序试下 ...
- Qt工作笔记-两种方法从容器中筛选出父类和子类(继承法、typeid法)
两种方法程序运行界面效果都一样! 程序运行截图如下: 这个图随便看看就可以了,没啥用! 代码如下: widget.h #ifndef WIDGET_H #define WIDGET_H#include ...
- Neo4j的两种方式访问(嵌入式访问、服务器模式访问)-- java客户端连接和SpringBoot整合Neo4j
一.Neo4j数据库访问 1.Neo4j数据库访问 嵌入式数据库 服务器模式(通过REST的访问) 它是由应用程序的性质(neo4j是独立服务器 还是和程序在一起),性能,监控和数据安全性来决定架构选 ...
- jetty服务器上运行html页面,web项目嵌入Jetty运行的两种方式(Jetty插件和自制Jetty服务器)...
自制Jetty服务类 这种方式可以支持websocket,如果项目中需要使用到可以试试这种. 首先pom.xml引入jetty的依赖: org.eclipse.jetty.aggregate jett ...
- 用程序猿思维、程序设计师思维两种方式写求斐波那契数列的方法。
//用Java实现斐波那契数列(Fibonacci) public class Test {public int f(int n)//n代表第几个数字.程序返回它相应的值{return n>2? ...
- 安卓 发送短信两种方式
android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: Java代码 //直接调用短信接口发短信 SmsManager smsManager = SmsMan ...
- SSM整合之Mybatis笔记( MyBatis获取参数值的两种方式(重要))(P020—P025)
P20 MyBatis获取参数值的两种方式(重要) 一.什么叫做获取取参数值的两种方式 以后在我们开发是方向B/S系统,然后我们现在要做的任务通过浏览器/页面/视图 收集用户输入的一些数据,然后把这些 ...
- Struts2-表单验证的两种方式
1. Struts2中的输入校验 2. 编码方式校验 1) Action一定要继承自ActionSupport 2) 针对某个要进行校验的请求处理方法编写一个 public void vali ...
最新文章
- 字符串操作系列库函数
- wxWidgets:OLE 自动化示例
- git 忽略 部分文件夹_git设置忽略文件和目录
- 【FZU - 1759】Super A^B mod C (数论,快速幂,快速乘,欧拉降幂,指数循环节,模板)
- 1-java学习笔记
- 【前端】设置好CSS样式动态添加元素会按照样式显示
- HCL打开显示当前系统用户怎么解决_鼠标右键新建没有EXCEL 怎么解决?
- 第一阶段冲刺阶段项目总结
- ubuntu 18.04LTS 安装HP LaserJet 1020(含Plus) 驱动 cups自带驱动不正常的问题解决
- CentOS7.5 怎么修改默认SSH端口号
- C#解压zip和rar文件
- 一张思维导图完成淘宝精细化运营
- Jzoj4722 跳楼机
- nod-1483-化学变换
- 企业局域网即时通讯软件存在是必然趋势
- Hacker基础之Linux篇——基础Linux命令二
- 从来不是别人的不幸和痛苦
- 推荐系统笔记(MAB问题)
- Spring Cloud Hystrix 服务容错保护
- Unity3D-游戏场景优化之遮挡剔除(Occlusion Culling)的使用