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

简介: JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求 哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交 觉得那个毕竟是别人写得API库,所以我就自己实现了一个简单的HTTP客户端,支持POST 方式提交数据...

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);

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

String path = "/jia20003/article/details/16908661";
SocketAddress dest = new InetSocketAddress(this.host, this.port);
socket.connect(dest);
OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream());
bufferedWriter = new BufferedWriter(streamWriter);
bufferedWriter.write("GET " + path + " HTTP/1.1\r\n");
bufferedWriter.write("Host: " + this.host + "\r\n");
bufferedWriter.write("\r\n");
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请求等.

完整的测试程序如下:

package com.gloomyfish.http.client;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.URLEncoder;

public class TestDemo {
	private int port;
	private String host;
	private Socket socket;
	private BufferedReader bufferedReader;
	private BufferedWriter bufferedWriter;
	public TestDemo(String host, int port) {
		socket = new Socket();
		this.host = host;
		this.port = port;
	}
	
	public void sendGet() throws IOException
	{
		String path = "/zhigang/getDemo.php";
		SocketAddress dest = new InetSocketAddress(this.host, this.port);
		socket.connect(dest);
		OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream());
		bufferedWriter = new BufferedWriter(streamWriter);
		
		bufferedWriter.write("GET " + path + " HTTP/1.1\r\n");
		bufferedWriter.write("Host: " + this.host + "\r\n");
		bufferedWriter.write("\r\n");
		bufferedWriter.flush();
		
		BufferedInputStream streamReader = new BufferedInputStream(socket.getInputStream());
		bufferedReader = new BufferedReader(new InputStreamReader(streamReader, "utf-8"));
		String line = null;
		while((line = bufferedReader.readLine())!= null)
		{
			System.out.println(line);
		}
		bufferedReader.close();
		bufferedWriter.close();
		socket.close();
	}
	
	public void sendPost() throws IOException
	{
		String path = "/zhigang/postDemo.php";
		String data = URLEncoder.encode("name", "utf-8") + "=" + URLEncoder.encode("gloomyfish", "utf-8") + "&" +
						URLEncoder.encode("age", "utf-8") + "=" + URLEncoder.encode("32", "utf-8");
		// String data = "name=zhigang_jia";
		SocketAddress dest = new InetSocketAddress(this.host, this.port);
		socket.connect(dest);
		OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream(), "utf-8");
		bufferedWriter = new BufferedWriter(streamWriter);
		
		bufferedWriter.write("POST " + path + " HTTP/1.1\r\n");
		bufferedWriter.write("Host: " + this.host + "\r\n");
		bufferedWriter.write("Content-Length: " + data.length() + "\r\n");
		bufferedWriter.write("Content-Type: application/x-www-form-urlencoded\r\n");
		bufferedWriter.write("\r\n");
		bufferedWriter.write(data);
		bufferedWriter.flush();
		bufferedWriter.write("\r\n");
		bufferedWriter.flush();
		
		BufferedInputStream streamReader = new BufferedInputStream(socket.getInputStream());
		bufferedReader = new BufferedReader(new InputStreamReader(streamReader, "utf-8"));
		String line = null;
		while((line = bufferedReader.readLine())!= null)
		{
			System.out.println(line);
		}
		bufferedReader.close();
		bufferedWriter.close();
		socket.close();
	}
	
	public static void main(String[] args)
	{
		TestDemo td = new TestDemo("127.0.0.1",8099);
		try {
			// td.sendGet(); //send HTTP GET Request
			
			td.sendPost(); // send HTTP POST Request
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
想要成为支持HTTPS客户端, 只要在创建Socket的时候如下:
socket = (SSLSocket)((SSLSocketFactory)SSLSocketFactory.getDefault()).createSocket(this.host, port);
所以有时候离开apache的HTTP Client等第三方Jar,程序员也是一样活!

目录
相关文章
|
4月前
|
缓存 安全 网络协议
HTTP和HTTPS的区别有哪些?
本文简要总结了 HTTP 和 HTTPS 的区别,从概念、端口、连接方式、使用场景、安全性等多个角度进行了对比。HTTP 是无状态的、无连接的应用层协议,适用于一般性网站和性能要求较高的应用;HTTPS 则通过 SSL/TLS 层提供加密、认证和完整性保护,适用于涉及敏感信息和高安全性的场景。文章还讨论了两者在性能上的差异,包括握手和加密开销、缓存效果以及 HTTP/2 的多路复用技术。最终,根据具体需求选择合适的协议能够更好地平衡安全性和性能。
912 2
HTTP和HTTPS的区别有哪些?
|
3月前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
97 3
|
2天前
|
缓存 安全 网络安全
代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?
本文详细介绍了HTTP、HTTPS和SOCKS5三种代理协议的特点、优缺点以及适用场景。通过对比和分析,可以根据具体需求选择最合适的代理协议。希望本文能帮助您更好地理解和应用代理协议,提高网络应用的安全性和性能。
29 17
|
12天前
|
网络协议 安全 网络安全
Introduction to the HTTP and HTTPS Protocol
HTTP protocol is the foundation of the Internet, and HTTPS is the secure version of HTTP. HTTP is an application layer protocol based on TCP/IP protocol. It does not involve packet (packet) transmission, mainly specifying the communication format between the client and the server, and the default po
62 25
|
2月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
105 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
29天前
|
安全 搜索推荐 网络安全
HTTPS与HTTP:区别及安全性对比
HTTP和HTTPS是现代网络通信中的两种重要协议。HTTP为明文传输,简单但不安全;HTTPS基于HTTP并通过SSL/TLS加密,确保数据安全性和完整性,防止劫持和篡改。HTTPS还提供身份验证,保护用户隐私并防止中间人攻击。尽管HTTPS有额外的性能开销和配置成本,但在涉及敏感信息的场景中,如在线支付和用户登录,其安全性优势至关重要。搜索引擎也更青睐HTTPS网站,有助于提升SEO排名。综上,HTTPS已成为大多数网站的必然选择,以保障用户数据安全和合规性。
60 1
|
2月前
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
657 7
|
2月前
|
安全 算法 网络安全
HTTP和HTTPS的区别
本文介绍HTTP与HTTPS的区别、HTTPS链接建立过程及常见加密算法。HTTP为明文传输,易被窃听;HTTPS通过SSL/TLS协议加密,确保数据安全。HTTPS使用端口443,提供认证机制。文中还详细讲解了对称加密(如AES、DES)和非对称加密(如RSA、ECC)算法的特点及应用场景。
|
3月前
|
缓存 安全 网络安全
HTTP/2与HTTPS在Web加速中的应用
HTTP/2与HTTPS在Web加速中的应用
115 11
|
3月前
|
前端开发 JavaScript 数据库
https页面加载http资源的解决方法
https页面加载http资源的解决方法
92 5

热门文章

最新文章