JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求

哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交

觉得那个毕竟是别人写得API库,所以我就自己实现了一个简单的HTTP客户端,支持POST

方式提交数据,GET方式查询数据,是测试Restful API比较方便点,然后支持form与JSON两

种方式提交数据,当然也支持返回数据为JSON格式.当然这些东西都是基于JAVA Socket直

接完成的,不借助任何第三方的库,主要是JDK的API其实已经够用啦. 当然我也没有用

URLConnect这个东西,毕竟它在Socket基础上又包装了一下,有违我写这篇文章的目的.

好啦,讲完理由,下面就说说要怎么样才能实现啊,光说不练假把式啊!大致分了几个步骤

一:当然是要知道HTTP协议,知道常用的HTTP请求头,比如Host, Accept, Content-Type

知道HTTP协议支持的方法,常用有GET/POST/PUT/DELETE等

如果不知道,也不用担心,我保证你读完这篇文章,你就知道一些啦,当然有个最好的参考

文档就是HTTP相关的RFC文档,认真读一下肯定解决你自己心中的HTTP那些疑惑

二: 知道发送HTTP GET与POST格式很重要, 固定的格式如下:

[REQUEST]<SP><URL><SP>[HTTP VERSION]<CLRF>

[REQUEST HEADER: ]<SP>[VALUE]<CLRF>

可以有多个请求头

最后<CLRF>

发送完HTTP请求头部以后, 针对不同请求如POST要发送内容部分,发送完成以后同样

以<CLRF>结尾.

解释: <SP>表示空格, <CLRF>表示回车换行JAVA中表示为”\r\n”

REQUEST表示HTTP请求命令,可以为POST, GET, PUT, DELETE等之一

HTTP VERSION的常见可能值为HTTP/1.1或者HTTP/1.0

三: 如果1与2的知识你都具备了,下面就来介绍一下JAVA Socket的相关知识

如何创建一个JAVA客户端套接字Socket s = new Socket()如此即可,简单吧!

如何连接到远程的主机与端口, 当提供URL字符串时候,可以这么做

URL url = new URL(“http://blog.csdn.net/jia20003”);

String host = url.getHost;

int port = url.getDefaultPort();

SocketAddress
dest = new InetSocketAddress(this.host, this.port);

s.connect(dest);

即可连接到远程主机,下面就可以请求文章内容了, 也很容易的

  1. String path = "/jia20003/article/details/16908661";
  2. SocketAddress dest = new InetSocketAddress(this.host, this.port);
  3. socket.connect(dest);
  4. OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream());
  5. bufferedWriter = new BufferedWriter(streamWriter);
  6. bufferedWriter.write("GET " + path + " HTTP/1.1\r\n");
  7. bufferedWriter.write("Host: " + this.host + "\r\n");
  8. bufferedWriter.write("\r\n");
  9. bufferedWriter.flush();

最后也是最重要的一点,字符编码,尽量都用同一种字符编码来发

送请求数据,推荐使用utf-8测试程序, 我写两个简单的PHP文件放

在wamp server上,完成对全部代码的测试

四:关于HTTP与HTTPS

HTTP协议是位于第四层协议TCP之上完成的应用层协议, 端到端都是明文传送,别人一

旦网络抓包以后都可以看到你的提交与请求数据,这个好像不太安全. HTTP协议的默认

端口是80这个是RFC文档声明的,属于官方标准,没什么道理可以讲.

HTTPS是基于SSL加密传输的,这样别人截获你的数据包破解的概率要小一点,比HTTP安

全一点,其默认端口是443, 好像QQ邮箱与谷歌的WEB Mail邮箱都是基于HTTPS. 但是

HTTPS通信方式只是传输数据加密,都客户端来说是透明的,它还是一样要遵守HTTP协

议规范来发送POST与GET请求等.

完整的测试程序如下:

  1. package com.gloomyfish.http.client;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStreamWriter;
  8. import java.net.InetSocketAddress;
  9. import java.net.Socket;
  10. import java.net.SocketAddress;
  11. import java.net.URLEncoder;
  12. public class TestDemo {
  13. private int port;
  14. private String host;
  15. private Socket socket;
  16. private BufferedReader bufferedReader;
  17. private BufferedWriter bufferedWriter;
  18. public TestDemo(String host, int port) {
  19. socket = new Socket();
  20. this.host = host;
  21. this.port = port;
  22. }
  23. public void sendGet() throws IOException
  24. {
  25. String path = "/zhigang/getDemo.php";
  26. SocketAddress dest = new InetSocketAddress(this.host, this.port);
  27. socket.connect(dest);
  28. OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream());
  29. bufferedWriter = new BufferedWriter(streamWriter);
  30. bufferedWriter.write("GET " + path + " HTTP/1.1\r\n");
  31. bufferedWriter.write("Host: " + this.host + "\r\n");
  32. bufferedWriter.write("\r\n");
  33. bufferedWriter.flush();
  34. BufferedInputStream streamReader = new BufferedInputStream(socket.getInputStream());
  35. bufferedReader = new BufferedReader(new InputStreamReader(streamReader, "utf-8"));
  36. String line = null;
  37. while((line = bufferedReader.readLine())!= null)
  38. {
  39. System.out.println(line);
  40. }
  41. bufferedReader.close();
  42. bufferedWriter.close();
  43. socket.close();
  44. }
  45. public void sendPost() throws IOException
  46. {
  47. String path = "/zhigang/postDemo.php";
  48. String data = URLEncoder.encode("name", "utf-8") + "=" + URLEncoder.encode("gloomyfish", "utf-8") + "&" +
  49. URLEncoder.encode("age", "utf-8") + "=" + URLEncoder.encode("32", "utf-8");
  50. // String data = "name=zhigang_jia";
  51. SocketAddress dest = new InetSocketAddress(this.host, this.port);
  52. socket.connect(dest);
  53. OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream(), "utf-8");
  54. bufferedWriter = new BufferedWriter(streamWriter);
  55. bufferedWriter.write("POST " + path + " HTTP/1.1\r\n");
  56. bufferedWriter.write("Host: " + this.host + "\r\n");
  57. bufferedWriter.write("Content-Length: " + data.length() + "\r\n");
  58. bufferedWriter.write("Content-Type: application/x-www-form-urlencoded\r\n");
  59. bufferedWriter.write("\r\n");
  60. bufferedWriter.write(data);
  61. bufferedWriter.flush();
  62. bufferedWriter.write("\r\n");
  63. bufferedWriter.flush();
  64. BufferedInputStream streamReader = new BufferedInputStream(socket.getInputStream());
  65. bufferedReader = new BufferedReader(new InputStreamReader(streamReader, "utf-8"));
  66. String line = null;
  67. while((line = bufferedReader.readLine())!= null)
  68. {
  69. System.out.println(line);
  70. }
  71. bufferedReader.close();
  72. bufferedWriter.close();
  73. socket.close();
  74. }
  75. public static void main(String[] args)
  76. {
  77. TestDemo td = new TestDemo("127.0.0.1",8099);
  78. try {
  79. // td.sendGet(); //send HTTP GET Request
  80. td.sendPost(); // send HTTP POST Request
  81. } catch (IOException e) {
  82. // TODO Auto-generated catch block
  83. e.printStackTrace();
  84. }
  85. }
  86. <span style="font-size:18px;">}</span>

想要成为支持HTTPS客户端, 只要在创建Socket的时候如下:

  1. <span style="font-size:18px;">socket = (SSLSocket)((SSLSocketFactory)SSLSocketFactory.getDefault()).createSocket(this.host, port);</span>

所以有时候离开apache的HTTP Client等第三方Jar,程序员也是一样活!

原文:http://blog.csdn.net/jia20003/article/details/17104791

JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求的更多相关文章

  1. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

    目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...

  2. java socket实现服务端,客户端简单网络通信。Chat

    之前写的实现简单网络通信的代码,有一些严重bug.后面详细写. 根据上次的代码,主要增加了用户注册,登录页面,以及实现了实时显示当前在登录状态的人数.并解决一些上次未发现的bug.(主要功能代码参见之 ...

  3. java Socket 长连接 心跳包 客户端 信息收发 demo

    今天写了个socket的测试小程序,代码如下 import java.io.IOException; import java.io.InputStream; import java.io.Output ...

  4. java socket编程 初级 服务器端和客户端 通信

    package server; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerS ...

  5. Java Socket 死循环while如何判断客户端断开

    多线程的服务器程序 线程中等待客户端的消息    我的代码能实现服务器与客户端的通信    问题是: 当客户端中断或退出  以上代码却不能判断Socket中断 跳不出while的无限循环 解决方法: ...

  6. Android客户端采用Http 协议Post方式请求与服务端进行数据交互(转)

    http://blog.csdn.net/javanian/article/details/8194265

  7. Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系

    HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...

  8. 实现服务器和客户端数据交互,Java Socket有妙招

    摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...

  9. socket 服务器向指定的客户端发消息

    一.需求 需求如题. 当多个客户端连接服务器时,服务器如何给指定的客户端发送消息. 二.解决方案 核心思想: 在服务器端,需保存不同客户端的socket列表及客户端相关信息. socket含有发送方和 ...

随机推荐

  1. Python快速教程 尾声(转)

    原文地址: http://www.cnblogs.com/vamei/p/3603046.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留 ...

  2. LeetCode:Pascal's Triangle I II

    LeetCode:Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For examp ...

  3. 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析

    20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...

  4. CDC类

    CDC :class of device context Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 .MFC基础类库定义了设备环境对象类----CD ...

  5. Android图片浏览器之图片删除

    前一篇介绍了怎么从手机中读取图片文件,放入组件GridView实现网格效果的缩略图显示. 今天研究了对GridView中的子项(各张小图片)进行删除的操作,参考已有软件,长按图片跳出删除确认框. Gr ...

  6. XAMPP里tomcat启动报错:Make sure you have Java JDK or JRE installed and the required ports are free

    以前用XAMPP的时候就是自然而然装好了就可以用,最近重装了新系统,打算在Windows 10里面配置Apache tomcat.PHP.MySQL的开发环境,迟迟试验不成功,于是直接用了XAMPP, ...

  7. 年前辞职-WCF入门学习(3)

    前言 [2了,刚写好的,手贱,点了删除,还真TMD的删除了,只好重写] 今天周六,去同事家聚了一个餐,感觉各种豪华. 废话不多说,前两集大致介绍了一下什么是WCF以及和WCF相关的WebService ...

  8. 第四十四课:jQuery UI和jQuery easy UI

    jQuery UI是jQuery官方提供的功能效果和UI样式.作为官方出的东西,它一直没有被人们看重,一是它没有datagrid,tree等UI库必备的东西,二是它修改太过频繁,体积庞大.其实它所有以 ...

  9. 软工实践练习——使用git进行代码管理心得

    一.在Github上注册账户.其中创建organization在小组成员的账户上创建,并在其账户上创建了小组的版本库.在创建organization的过程中,参考了助教提供的博客:http://sef ...

  10. Opentack常用技巧

    这篇博客将收集一些openstack里的使用技巧. 1. which dhcp agent is hosting the network?   2. 各个网桥port命令规则 grep for por ...