java使用socket实现http简单get请求

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
Java代码 复制代码 收藏代码
  1. package com.hs;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.LineNumberReader;
  6. import java.io.OutputStream;
  7. import java.net.Socket;
  8. import java.net.UnknownHostException;
  9. public class SimpleHttpGet {
  10. public static final String SEQUENCE = "\r\n";
  11. public static void main(String[] args) throws UnknownHostException,
  12. IOException {
  13. String host = "www.baidu.com";
  14. Socket socket = new Socket(host, 80);
  15. OutputStream os = socket.getOutputStream();
  16. StringBuffer head = new StringBuffer();
  17. // 这些是必须的
  18. head.append("GET / HTTP/1.1" + SEQUENCE);
  19. head.append("Host:" + host + SEQUENCE + SEQUENCE);
  20. // 这些是可选的
  21. head.append("Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
  22. head.append("Accept-Language:zh-CN,zh;q=0.8");
  23. head.append("User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
  24. os.write(head.toString().getBytes());
  25. os.flush();
  26. InputStream is = socket.getInputStream();
  27. LineNumberReader lnr = new LineNumberReader(new InputStreamReader(is));
  28. StringBuffer headRes = new StringBuffer();
  29. String line = null;
  30. int contentLength = 0;
  31. do {
  32. line = lnr.readLine();
  33. headRes.append(line + SEQUENCE);
  34. if (line.startsWith("Content-Length")) {
  35. contentLength = Integer.parseInt(line.split(":")[1].trim());
  36. }
  37. // 由于LineNumberReader会把\r\n替换掉,所以如果读到一行为""证明http head结束
  38. } while (!line.equals(""));
  39. int totalCount = 0;
  40. byte[] buff = new byte[256];
  41. StringBuffer contentRes = new StringBuffer();
  42. while (totalCount < contentLength) {
  43. int len = is.read(buff);
  44. totalCount += len;
  45. contentRes.append(new String(buff, 0, len, "gbk"));
  46. }
  47. System.out.println(headRes.toString());
  48. System.out.println(contentRes.toString());
  49. socket.close();
  50. }
  51. }
package com.hs;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class SimpleHttpGet {
	public static final String SEQUENCE = "\r\n";

	public static void main(String[] args) throws UnknownHostException,
			IOException {
		String host = "www.baidu.com";
		Socket socket = new Socket(host, 80);
		OutputStream os = socket.getOutputStream();
		StringBuffer head = new StringBuffer();
		// 这些是必须的
		head.append("GET / HTTP/1.1" + SEQUENCE);
		head.append("Host:" + host + SEQUENCE + SEQUENCE);
		// 这些是可选的
		head.append("Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
		head.append("Accept-Language:zh-CN,zh;q=0.8");
		head.append("User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
		os.write(head.toString().getBytes());
		os.flush();
		InputStream is = socket.getInputStream();
		LineNumberReader lnr = new LineNumberReader(new InputStreamReader(is));
		StringBuffer headRes = new StringBuffer();
		String line = null;
		int contentLength = 0;
		do {
			line = lnr.readLine();
			headRes.append(line + SEQUENCE);
			if (line.startsWith("Content-Length")) {
				contentLength = Integer.parseInt(line.split(":")[1].trim());
			}
		// 由于LineNumberReader会把\r\n替换掉,所以如果读到一行为""证明http head结束
		} while (!line.equals(""));
		
		int totalCount = 0;
		byte[] buff = new byte[256];
		StringBuffer contentRes = new StringBuffer();
		while (totalCount < contentLength) {
			int len = is.read(buff);
			totalCount += len;
			contentRes.append(new String(buff, 0, len, "gbk"));
		}
		System.out.println(headRes.toString());
		System.out.println(contentRes.toString());
		socket.close();
	}
}

只实现了get请求,而且如果http head中没有 content-length也会有问题, 比如有的网站头中有

Transfer-Encoding:
chunked ,这样就会没有content-length信息, 这个我也没解决, 如果谁有兴趣可以以深入了解下http协议头中的
Transfer-Encoding:
chunked代表什么意思。
探究HTTP报文并原生socket手写实现HTTP请求的request和response http报文以及原生socket实现http协议request和response的解析 阅读详情

相关推荐

使用Java socket 实现 HTTP 协议

突然发现 CSDN 可以使用MarkDown编辑器了,真是一种进步啊!不过貌似出来的太晚了,呵呵。 这篇文章我们讲一下如何使用 简单Java socket实现部分的 HTTP协议。 1. 要实现HTTP协议必须要了解 HTTP协议 HTTP协议是超文本传输协议(Hypertext Transfer Protocol),在OSI七层模型之中属于应用层协议。 在传输层由TCP/I

xiaorenwuzyh的专栏 1651

Java Sokect编程之HTTP请求

1、概述   HTTP是一种协议,全称超文本传输协议,而网页就属于超文本(就是为了它服务的),可以支持多媒体等,比如图片、音频,丰富了用户的体验;它属于网络模型中应用层的协议,底层基于TCP/IP协议,并额外制定了自己的规范,所以它也是Socket编程的一种,只是由于强大和便捷的客户端和服务端软件,常常让人看不到它的本质。   首先HTTP属于网络编程,而且是基于TCP/IP协

Noodles的博客 3978

别再傻傻分不清了!嵌入式开发中Bin、Hex、S19文件到底怎么选?

本文深入解析嵌入式开发中Bin、Hex和S19三种烧录文件格式的区别与应用场景,帮助开发者根据项目需求选择最合适的格式。从基础特性到实际应用,涵盖STM32开发、汽车电子及物联网设备OTA升级等场景,提供专业的选择指南和实用技巧。

weixin_33701294的博客 704

使用Socket发送HTTP请求

java开发中有不少发送Http请求的需求,比较常见的工具类有HttpURLConnection,HttpClient和Spring中的RestTemplate,这几个类封装程度一个比一个高,越来越方便开发,更符合面向对象的编程思想.但是久而久之,也渐渐地忽略了它们背后的HTTP协议和Socket开发....

学习笔记 3731

java socket http请求_JAVA中利用socket实现HTTP请求

一个基于java的web服务器实现主要使用这两个重要的类:java.net.Socketjava.net.ServerSocket,并通过HTTP消息进行通信。HTTP请求一个HTTP请求包括三个组成部分:1.方法—统一资源标示符(URI)—协议/版本2.请求的头部3.主体内容GET / HTTP/1.1Host: 127.0.0.1:8080Connection: keep-aliveAcce...

weixin_31822835的博客 2649

使用java socket完成一个简单http服务器解析Get请求

java

qq_41103091的博客 1145

JAVA编写的使用Socket模拟HttpGET操作

JAVA编写的使用Socket模拟HttpGET操作,看后就很容易理解Web浏览器的原理了。 import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket;

雷霄骅(leixiaohua1020)的专栏 7189

8.4 Java 原生 TCP Socket 实现 HTTP 请求解析和请求分发

try {");});try {});// 解析请求行// 解析请求头while (!// 读取请求体(仅处理 POST)// 构建请求和响应对象// 路由分发= null) {} else {

chxii的专栏 937

java socket http请求_java通过socket执行http请求

导入包:importjava.io.*;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.Socket;importjava.net.URL;importjava.util.List;/***通过socket请求**@paramurlString*@param...

weixin_29798625的博客 396

【网络】JAVA Socket 实现HTTPHTTPS客户端发送POST与GET方式请求

JAVA Socket 实现HTTPHTTPS客户端发送POST与GET方式请求   哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交 觉得那个毕竟是别人写得API库,所以我就自己实现了一个简单HTTP客户端,支持POST 方式提交数据,GET方式查询数据,是测试Restful API比较方便点,然后支持form与JSON两 种方式提

u011494050的专栏 2029

使用socket模拟Http请求

这里举一个简单的例子,使用socket来模拟一段http访问百度代码

if(...){...} 1万+

Socket模拟浏览器请求网页

什么是socket? 简单讲,socket是对tcp进行封装,对外提供网络连接的接口 原理 http底层的实现是通过socket实现的,打开http服务器(web服务器)实际上是创建了SocketServer;浏览器请求网页时,则是通过socket去连接服务器,使用http协议完成数据的传输。 环境搭建 可以使用正式的网站,也可以自己打一个网页服务器(xampp,Nginx,tomca...

GB的博客 2012

html网页socket,Socket请求网页

Java Socket现实简单HTTP服务http://jiangzhengjun.iteye.com/blog/512380Java socket 访问网页http://blog.csdn.net/yilip/article/details/45195713import java.io.BufferedReader;import java.io.BufferedWriter;import ja...

weixin_39611382的博客 1037

JAVA编写的一个简单Socket实现HTTP响应服务器

JAVA编写的一个简单Socket实现HTTP响应服务器,看后就很容易理解Web服务器的原理了。package test.io; import java.net.*; import java.io.*; /** * 一个简单Socket实现HTTP响应服务器。 * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。 * * @autho

u012945986的博客 7291

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

JAVA Socket 实现HTTPHTTPS客户端发送POST与GET方式请求 哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交 觉得那个毕竟是别人写得API库,所以我就自己实现了一个简单HTTP客户端,支持POST 方式提交数据,GET方式查询数据,是测试Restful API比较方便点,然后支持form与JSON两

huangxinyu_it的专栏 940

java sockethttp服务器发送get命令

代码如下 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; impor

Java小鱼 509

使用socket发送http请求

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34293911的博客 159
上一篇: java nio缓冲器(转)
下一篇: 别人发的小例子log4j
dahe5
博客等级 码龄14年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值