网络编程(发送get和post请求到服务器端,并获取响应)
一:B/S结构,浏览器端到服务器端通信依赖http协议
交互过程:
1:在浏览器地址栏输入http://ip:port/应用/资源路径
2:浏览器根据ip和服务器建立连接,port确定和那个应用进行交互,因为ip主机上面有
很多应用程序。
3:浏览器端发送请求以及参数到服务器端,就是url(同一资源定位器),确定请求资源。
4:服务器处理请求,将处理后的结果响应发送到浏览器。
5:浏览器得到资源后,渲染到界面,显示给用户。
优点:B/S交互可以省去客户端部署升级的风险,降低了成本,只需要关注服务器开发。
二:C/S结构,客户端到服务器端通信也是依赖HTTP协议
主要是java应用程序与服务器的交互,交互过程:
1:根据请求url创建URL对象
2:创建连接对象URLConnection,设置连接参数,建立连接。
3:发送请求到服务器,服务器进行处理
4:服务器发送响应到客户端。
三:get请求与post请求的异同点
1:get请求会将请求参数显示在请求地址的后面,post不会,所以post相较于get更安全,但是安全是相对的,
如果追求安全发送请求还是要加密。
2:get请求发送数据理论上是4kb,而post理论上可以发送任意大的数据
3:如果是C/S结构,post请求在建立连接前,要设置DoInput和DoOutput的值
四:java程序请求服务器实例
get请求案例:
/**
* 发送get请求,参数放在url后面
*/
public static String sendGetRequest(String url, String params) {
StringBuilder result = new StringBuilder();
String realUrl = url + "?" + params;
InputStream in = null;
BufferedReader br = null;
try {
// 与服务器建立连接
URL u = new URL(realUrl);
URLConnection conn = u.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "keep-alive");
conn.connect(); // 获取响应头
Map<String, List<String>> map = conn.getHeaderFields();
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String key = it.next();
System.out.println(key + ":::" + map.get(key));
} // 获取响应数据
in = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(in, "utf-8"));
String line;
while ((line = br.readLine()) != null) {
result.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result.toString();
}
post请求案例:
/**
* 发送post请求,参数单独发送到服务器端
*/
public static String sendPostRequest(String url, String params) {
StringBuilder result = new StringBuilder();
String realUrl = url;
InputStream in = null;
BufferedReader br = null;
try {
// 与服务器建立连接
URL u = new URL(realUrl);
URLConnection conn = u.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "keep-alive"); // post请求必须设置请求头
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect(); // 发送参数到服务器
OutputStream out = conn.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,
"utf-8"));
pw.print(params);
pw.flush();
pw.close(); // 获取响应头
Map<String, List<String>> map = conn.getHeaderFields();
Set<Entry<String, List<String>>> entry = map.entrySet();
Iterator<Entry<String, List<String>>> it = entry.iterator();
while (it.hasNext()) {
Entry<String, List<String>> en = it.next();
System.out.println(en.getKey() + ":::" + en.getValue());
} // 获取响应数据
in = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(in, "utf-8"));
String line;
while ((line = br.readLine()) != null) {
result.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result.toString();
}
测试案例:
// 测试发送请求
public static void main(String[] args) {
String url = "http://localhost:8080/healthcare/dataAnalysis/search.do";
String params = "tname=employee";
// 测试get请求
System.out.println(SendGetAndPost.sendGetRequest(url, params));
// 测试post请求
System.out.println(SendGetAndPost.sendPostRequest(url, params));
}
以上代码均已经过验证。
网络编程(发送get和post请求到服务器端,并获取响应)的更多相关文章
- iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConn ...
- iOS开发网络篇—发送GET和POST请求(使用NSURLSession) - 转
说明: 1.该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2.本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求. ...
- 【TCP/IP网络编程】:04基于TCP的服务器端/客户端
摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...
- 【TCP/IP网络编程】:06基于UDP的服务器端/客户端
本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先 ...
- 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档
Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...
- Linux C 网络编程——多线程的聊天室实现(服务器端)
服务器端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人,可进行更改),每个人所发送的消息其他用户均可以收到.用户可以随意的加入或退出(推出以字符串"bye"实现),服 ...
- netty例子-客户端每隔5秒发送查询时间的请求,服务器端响应请求
netty是jboss公司开发的,基于异步的.事件驱动的网络应用程序框架,快速开发高性能.高可靠性的服务器和客户端程序 public class TimeServer { ; public void ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- JAVA的网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
随机推荐
- POJ3237-Tree (树链剖分,线段树区间更新+点更新+区间查询)
两个更新操作,一个将第i条路径权值改为w,一个是将a-b之间所有路径权值取反. 一个查询操作,求a-b之间路径中权值最大的边. 很容易想到维护一个最大最小值,取反就是把最大最小取反交换一下. 开始遇到 ...
- Java中快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...
- mysql数据库中查询时间
项目中要对数据按时间处理,在数据库中,时间处理的格式如 2014-12-09 06:30:17 时间查询出来如下所示: 现在要查询具体有哪天的数据,应用substring函数,SQL如下: ) as ...
- jquery easyui的异步tree
1.创建一个简单的tree 结果如图: <script> $(function(){ $('#tt').tree(){ url:'要提交的url地址', checkbox:true, li ...
- 在 Web 层应用程序中使用Spring
前面已经配置成功后,就可以在Web 层的Servlet或Jsp中调用访问Spring了,如果你 编制的是一个Servlet/Jsp 程序,那么在你的Servlet/Jsp 使用下面的代码通过Sprin ...
- hbase 学习笔记一---基本概念
说在前面,本文部分内容来源于社区官网经过适度翻译,部分根据经验总结,部分是抄袭网络博文,(不一一列举引用,在此致歉)一并列在一起,本文的目的,希望能总结出一些有用的,应该注意到的东西,基本 ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- struts validate
1 login.jsp方式1 <%@ page language="java" import="java.util.*" pageEncoding=&q ...
- Linux学习笔记----(2)
闲着无事,就敲起了Linux 命令,熟悉一下.记得昨天在书上看到了 find命令的用法,觉得挺神奇的. 其中 find 能够确定文件的查找深度 于是 敲了如下命令: #mkdir father #to ...
- ios8,xcode6 周边
NSBundle.mainBundle().infoDictionary iOS 8中带按钮的推送代码 ") ){ application.registerForRemoteNotifica ...