这段代码是简单的模拟了浏览器的请求行为。使用的是socket,大概步骤为:
1.建立socket链接。
2.写HTTP头信息。
3.分析服务器响应,这个步骤需要注意,头信息是正常的输入流,而正文是经过压缩的,如果在解析过程中没有解压会感觉鬼上身的哦。
上代码:
package xin;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.util.zip.GZIPInputStream;
public class ScoketTest {
public static void main(String[] args) throws Exception {
String baidu = "www.baidu.com";
Socket sk = new Socket(baidu, 80);
//请求头信息
String sb = setHeaderInfo();
OutputStream os = sk.getOutputStream();
os.write(sb.getBytes());//写入请求信息
os.flush();//需要刷新输出流 用来向服务器发送命令
//获取请求后的的流
InputStream is = sk.getInputStream();
//分析处理服务器返回信息
String result = getInputStream(is);
System.out.println("解压后正文信息: " + result);
sk.close();
os.close();
is.close();
}
/**
* 处理返回流信息
* @param is
* @return
* @throws UnsupportedEncodingException
* @throws IOException
*/
private static String getInputStream(InputStream is) throws UnsupportedEncodingException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StringBuffer sb = new StringBuffer();
//每次读取1M的数据 写入到baos
byte[] b = new byte[1024];
int end = 0;
try {
//读取返回流信息
//这里会阻塞 暂未找到好的解决方法
while ((end = is.read(b)) != -1) {
baos.write(b, 0, end);
}
baos.flush();
b = baos.toByteArray();
//分析头信息
int head_end = -1;
for (int i = 0; i < b.length; i++) {
if (b[i] == 13 && b[i + 1] == 10) {
System.out.println(new String(b, 0, i));
if (b[i + 2] == 13 && b[i + 3] == 10) {
head_end = i + 4;
break;
}
}
}
System.out.println("头信息:" + new String(b, 0, head_end));
//未解压正文 会产生乱码
System.out.println("(未解压正文:" + new String(b, head_end, b.length - head_end));
System.out.println("------------------------");
//分析正文 未压缩过的流 会抛出异常 java.io.IOException: Not in GZIP format
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(b, head_end,
b.length - head_end);
//解压流信息
GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream);
BufferedReader br = new BufferedReader(new InputStreamReader(gzipInputStream, "gb2312"));
while (br.read() != -1) {
sb.append(br.readLine());
}
br.close();
baos.close();
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 设置头信息
* @return
*/
private static String setHeaderInfo() {
StringBuffer sb = new StringBuffer();
sb.append("GET / HTTP/1.1\r\n");
sb.append("Connection: Keep-Alive\r\n");
// sb.append("User-Agent:wjy/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 IE+Firefox/4.0.1");
sb.append("Accept-Encoding:gzip, deflate\r\n");
sb.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
// sb.append("If-None-Match:5067cbeb8efe2a45ed5278888d6ceab0");
sb.append("\r\n");//根据HTTP协议 HTTP头信息和 正文之间有个换行
// sb.append("Accept-Charset:GB2312,utf-8;q=0.7,*;q=0.7");
// sb.append("Keep-Alive:115");
// sb.append("Connection:keep-alive");
// sb.append("Content-Type:application/json; charset=utf-8");
// sb.append("X-Requested-With:XMLHttpRequest");
// sb.append("Referer:http://login.m18.com/default.aspx");
return sb.toString();
}
}
分享到:
相关推荐
C语言socket发送http请求的例子源代码 一个使用C语言socket发送http请求的例子 这是一个linux下使用C的标准socket,进行http访问的例子。通过socket发送get请求,从中国天气网获得指定城市的天气。 该例子在ubuntu ...
在linux环境下,使用socket发送和接收http请求的例子
Java Socket 发送HTTP请求Web Service是一项...总的来说,Java Socket发送HTTP请求Web Service涉及网络编程和HTTP协议的理解,通过源码实现可以深入学习底层原理,但实际项目中可能更倾向于使用成熟的HTTP客户端库。
C#中使用Socket发送HTTP/HTTPS请求是一种高效的方法,特别是在需要自定义HTTP封包或对HTTP请求进行深入控制时。本文主要介绍了如何使用C#的Socket类来发送HTTP/HTTPS请求,并对相关的知识点进行了详细的解释。 ...
通过socket发送get请求,从中国天气网获得指定城市的天气。 该例子在ubuntu 14.04和AM3358的嵌入式linux3.14下实际测试可用。 如果需要在嵌入式linux下使用,需要修改Makefile文件的CC和LINK项,指向相应的交叉...
C#中用SOCKET发送HTTP请求小例 自行组织http报文,报显示服务器反馈回来的报头与报体信息。 ------------- HTTP/1.1 200 OK Date: Mon, 08 Dec 2008 14:20:51 GMT Server: BWS/1.0
4. **发送请求**:调用`send`函数将整个HTTP请求报文发送到服务器。 5. **接收响应**:使用`recv`函数从服务器接收HTTP响应报文,处理状态码、头部信息和可能的响应体。 6. **关闭连接**:当通信完成后,调用`...
基于java socket发送http请求。这种原生的发送请求的方式能适合一些特定场景,比如: A向B发送请求,A不考虑B是否处理成功,即A不关注B的响应结果,那么A就不用阻塞等B的回应。 传统的Httpclient请求方式都是阻塞...
今天给大家带来的是如何利用socket发送GET,POST请求。我借用燕十八老师封装好的一个Http类给进行说明。 在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可否利用其它方式...
本文实例讲述了PHP使用socket发送HTTP请求的方法。分享给大家供大家参考,具体如下: socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_...
在C++编程环境中,尤其是使用Microsoft Foundation Class (MFC) 库时,向服务器发送HTTP POST请求是一项常见的任务。这通常涉及到网络编程和套接字(Socket)的使用。本教程将详细介绍如何在Visual C++ (VC++) 中...
主要介绍了Python中使用socket发送HTTP请求数据接收不完整问题解决方法,本文使用一个循环解决了数据不完整问题,需要的朋友可以参考下
在我们的场景中,我们将使用socket连接到指定的服务器——ip.taobao.com,发送HTTP GET请求来获取IP地址的相关信息。 GET请求是HTTP协议中最常见的方法之一,用于从服务器获取资源。在这里,我们向淘宝的IP数据库...
例如,如果你想要测试一个HTTP服务器,你可以输入`telnet www.example.com 80`,如果连接成功,你将看到一个空白的命令行,这意味着你可以开始输入HTTP请求。 然而,"TCP socket请求报文发送工具"可能提供了更高级...
用Socket实现了发送HTTP请求,源码已经打包了 这些是CHttp里面公开的函数 void SetUrl(char*); //设置网页URL char* GetCookie(); //获取网页cookie void SetCookie(std::string strCookie);//添加cookie std::...
本文将深入探讨使用VC(Visual C++)进行Socket编程,特别是如何通过GET和POST方法发送HTTP请求,这在开发网络应用程序时非常常见。我们将分析标题、描述以及提供的文件名列表,并从中提炼出相关知识点。 首先,"VC...
在PHP中,使用Socket发送POST请求涉及以下步骤: 1. 创建Socket连接: 首先,我们需要创建一个Socket连接到目标服务器。这可以通过`socket_create()`函数完成,指定协议类型(如AF_INET代表IPv4)和套接字类型(如...
本文将深入探讨使用VC(Visual C++)进行Socket编程,特别是如何通过GET和POST方法发送HTTP请求。HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从Web服务器获取或提交数据。 首先,理解Socket...
本文将深入探讨标题中的"HttpSocket.rar",这是一个基于Windows Socket实现的HTTP请求封装类,它提供了便捷的方式来发送和接收HTTP请求。 首先,让我们来理解一下HTTP协议。HTTP是一种无状态、基于TCP/IP的应用层...