一: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请求案例:

  1. /**
  2. * 发送get请求,参数放在url后面
  3. */
  4. public static String sendGetRequest(String url, String params) {
  5. StringBuilder result = new StringBuilder();
  6. String realUrl = url + "?" + params;
  7. InputStream in = null;
  8. BufferedReader br = null;
  9. try {
  10. // 与服务器建立连接
  11. URL u = new URL(realUrl);
  12. URLConnection conn = u.openConnection();
  13. conn.setRequestProperty("accept", "*/*");
  14. conn.setRequestProperty("connection", "keep-alive");
  15. conn.connect();
  16.  
  17. // 获取响应头
  18. Map<String, List<String>> map = conn.getHeaderFields();
  19. Set<String> set = map.keySet();
  20. Iterator<String> it = set.iterator();
  21. while (it.hasNext()) {
  22. String key = it.next();
  23. System.out.println(key + ":::" + map.get(key));
  24. }
  25.  
  26. // 获取响应数据
  27. in = conn.getInputStream();
  28. br = new BufferedReader(new InputStreamReader(in, "utf-8"));
  29. String line;
  30. while ((line = br.readLine()) != null) {
  31. result.append(line);
  32. }
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. } finally {
  36. if (null != in) {
  37. try {
  38. in.close();
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. if (null != br) {
  44. try {
  45. br.close();
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. return result.toString();
  52. }

post请求案例:

  1. /**
  2. * 发送post请求,参数单独发送到服务器端
  3. */
  4. public static String sendPostRequest(String url, String params) {
  5. StringBuilder result = new StringBuilder();
  6. String realUrl = url;
  7. InputStream in = null;
  8. BufferedReader br = null;
  9. try {
  10. // 与服务器建立连接
  11. URL u = new URL(realUrl);
  12. URLConnection conn = u.openConnection();
  13. conn.setRequestProperty("accept", "*/*");
  14. conn.setRequestProperty("connection", "keep-alive");
  15.  
  16. // post请求必须设置请求头
  17. conn.setDoInput(true);
  18. conn.setDoOutput(true);
  19. conn.connect();
  20.  
  21. // 发送参数到服务器
  22. OutputStream out = conn.getOutputStream();
  23. PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,
  24. "utf-8"));
  25. pw.print(params);
  26. pw.flush();
  27. pw.close();
  28.  
  29. // 获取响应头
  30. Map<String, List<String>> map = conn.getHeaderFields();
  31. Set<Entry<String, List<String>>> entry = map.entrySet();
  32. Iterator<Entry<String, List<String>>> it = entry.iterator();
  33. while (it.hasNext()) {
  34. Entry<String, List<String>> en = it.next();
  35. System.out.println(en.getKey() + ":::" + en.getValue());
  36. }
  37.  
  38. // 获取响应数据
  39. in = conn.getInputStream();
  40. br = new BufferedReader(new InputStreamReader(in, "utf-8"));
  41. String line;
  42. while ((line = br.readLine()) != null) {
  43. result.append(line);
  44. }
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. } finally {
  48. if (null != in) {
  49. try {
  50. in.close();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. if (null != br) {
  56. try {
  57. br.close();
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. return result.toString();
  64. }

测试案例:

  1. // 测试发送请求
  2. public static void main(String[] args) {
  3. String url = "http://localhost:8080/healthcare/dataAnalysis/search.do";
  4. String params = "tname=employee";
  5. // 测试get请求
  6. System.out.println(SendGetAndPost.sendGetRequest(url, params));
  7. // 测试post请求
  8. System.out.println(SendGetAndPost.sendPostRequest(url, params));
  9. }

以上代码均已经过验证。

网络编程(发送get和post请求到服务器端,并获取响应)的更多相关文章

  1. iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

    iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConn ...

  2. iOS开发网络篇—发送GET和POST请求(使用NSURLSession) - 转

    说明: 1.该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2.本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求. ...

  3. 【TCP/IP网络编程】:04基于TCP的服务器端/客户端

    摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...

  4. 【TCP/IP网络编程】:06基于UDP的服务器端/客户端

    本篇文章简单描述了UDP传输协议的工作原理及特点. 理解UDP UDP和TCP一样同属于TCP/IP协议栈的第二层,即传输层. UDP套接字的特点 UDP的工作方式类似于传统的信件邮寄过程.寄信前应先 ...

  5. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  6. Linux C 网络编程——多线程的聊天室实现(服务器端)

    服务器端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人,可进行更改),每个人所发送的消息其他用户均可以收到.用户可以随意的加入或退出(推出以字符串"bye"实现),服 ...

  7. netty例子-客户端每隔5秒发送查询时间的请求,服务器端响应请求

    netty是jboss公司开发的,基于异步的.事件驱动的网络应用程序框架,快速开发高性能.高可靠性的服务器和客户端程序 public class TimeServer { ; public void ...

  8. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  9. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

随机推荐

  1. UVALive 7456 Least Crucial Node (并查集)

    Least Crucial Node 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/C Description http://7 ...

  2. Java线程池学习

    Java线程池学习 Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java ...

  3. hud 1166 敌兵布阵

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. LoadRunner显示中文乱码的问题

    lr_convert_string_encoding Converts a string to a different encoding. Return Values:This function re ...

  5. Delphi版浏览器(持续更新)

           自从加入校组织网络中心后要记住各种密码,本人记性不好,又比较喜欢偷懒,于是乎做个专用浏览器来免除这些麻烦,目前只是第一版,只是个简单成型的浏览器而已,在后续版本中会导入各种账号密码,免除 ...

  6. C# Dictionary用法总结

    转自:http://www.cnblogs.com/linlf03/archive/2011/12/09/2282574.html http://www.cnblogs.com/linzheng/ar ...

  7. WCF序列化与反序列化问题

    转自:http://www.cnblogs.com/wangweimutou/p/4505447.html WCF包含很多封装的内部机制,这些是我们在编写程序时不会经常看到的.比如上一篇讲解的Mess ...

  8. java的BigDecimal

    java的BigDecimal 一般设计到高精度的加法或乘法或者阶乘的求和积都会用到BigDecimal这个类. import java.util.*;import java.math.BigDeci ...

  9. Volley使用指南第三回(来自developer.android)

    继第二篇之后,再来Volley使用的教程的第三篇,有些翻译我是根据自己的理解,可能有错误的地方,还请多多包涵. 标准请求 这一回课将会告诉你Volley能够完成的3种请求类型 1.StringReqe ...

  10. jsp页面用el表达式获取枚举的code

    jsp页面用el表达式获取枚举的code <c:set var="D_BUSINESS" value="<%=DeptEnum.D_BUSINESS%> ...