import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList; /**
* 一个简单的HTTP客户端,发送HTTP请求,模拟浏览器 可打印服务器发送过来的HTTP消息
*/
public class HttpClient {
private static String encoding = "UTF-8"; public static void main(String[] args) {
try {
Socket s = new Socket(InetAddress.getLocalHost(), 8080);
OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream());
StringBuffer sb = new StringBuffer();
sb.append("GET /slsint_gd/reportview/reportViewList.jsp HTTP/1.1\r\n");
sb.append("Host: localhost:8088\r\n");
sb.append("Connection: Keep-Alive\r\n");
// 注,这是关键的关键,忘了这里让我搞了半个小时。这里一定要一个回车换行,表示消息头完,不然服务器会等待
sb.append("\r\n");
osw.write(sb.toString());
osw.flush(); // --输出服务器传回的消息的头信息
InputStream is = s.getInputStream();
String line = null;
int contentLength = 0;// 服务器发送回来的消息长度
// 读取所有服务器发送过来的请求参数头部信息
do {
line = readLine(is, 0);
// 如果有Content-Length消息头时取出
if (line.startsWith("Content-Length")) {
contentLength = Integer.parseInt(line.split(":")[1].trim());
}
// 打印请求部信息
System.out.print(line);
// 如果遇到了一个单独的回车换行,则表示请求头结束
} while (!line.equals("\r\n")); // --输消息的体
System.out.print(readLine(is, contentLength)); // 关闭流
is.close(); } catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /*
* 这里我们自己模拟读取一行,因为如果使用API中的BufferedReader时,它是读取到一个回车换行后
* 才返回,否则如果没有读取,则一直阻塞,直接服务器超时自动关闭为止,如果此时还使用BufferedReader
* 来读时,因为读到最后一行时,最后一行后不会有回车换行符,所以就会等待。如果使用服务器发送回来的
* 消息头里的Content-Length来截取消息体,这样就不会阻塞
*
* contentLe 参数 如果为0时,表示读头,读时我们还是一行一行的返回;如果不为0,表示读消息体,
* 时我们根据消息体的长度来读完消息体后,客户端自动关闭流,这样不用先到服务器超时来关闭。
*/
private static String readLine(InputStream is, int contentLe) throws IOException {
ArrayList lineByteList = new ArrayList();
byte readByte;
int total = 0;
if (contentLe != 0) {
do {
readByte = (byte) is.read();
lineByteList.add(Byte.valueOf(readByte));
total++;
} while (total < contentLe);// 消息体读还未读完
} else {
do {
readByte = (byte) is.read();
lineByteList.add(Byte.valueOf(readByte));
} while (readByte != 10);
} byte[] tmpByteArr = new byte[lineByteList.size()];
for (int i = 0; i < lineByteList.size(); i++) {
tmpByteArr[i] = ((Byte) lineByteList.get(i)).byteValue();
}
lineByteList.clear(); return new String(tmpByteArr, encoding);
}
}

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Set-Cookie: JSESSIONID=1F27447B2CDF30A69009A219932E259D; Path=/slsint_gd/; HttpOnly

Content-Type: text/html;charset=utf-8

Content-Language: zh-CN

Content-Length: 1881

Date: Mon, 14 Mar 2016 09:11:44 GMT

<html>     <head>         <title>广州农商行外汇数据报送系统</title>         <link rel="stylesheet" type="text/css" media="all" href="/slsint_gd/styles/default.css;jsessionid=1F27447B2CDF30A69009A219932E259D" />         <script type="text/javascript" src="/slsint_gd/scripts/global.js;jsessionid=1F27447B2CDF30A69009A219932E259D"></script>     </head>  <body>   <center>      <div align="center" style=" width:99%">    <div align="left"><span class="pagebanner">共0项</span></div><div align="right"><span class="pagelinks"></span></div> <table id="reports" width="100%" cellpadding="0" class="reportViewList list" cellspacing="0"> <thead> <tr> <th width="20%" class="sortable"></th> <th width="20%" class="sortable"> <a href="http://localhost:8088/slsint_gd/reportview/;jsessionid=1F27447B2CDF30A69009A219932E259D?d-1341553-o=2&amp;d-1341553-s=1">报表名称</a></th> <th width="20%" class="sortable"> <a href="http://localhost:8088/slsint_gd/reportview/;jsessionid=1F27447B2CDF30A69009A219932E259D?d-1341553-o=2&amp;d-1341553-s=2">报表类型</a></th> <th width="20%" class="sortable"> <a href="http://localhost:8088/slsint_gd/reportview/;jsessionid=1F27447B2CDF30A69009A219932E259D?d-1341553-o=2&amp;d-1341553-s=3">机构名称</a></th> <th width="10%" class="sortable"> <a href="http://localhost:8088/slsint_gd/reportview/;jsessionid=1F27447B2CDF30A69009A219932E259D?d-1341553-o=2&amp;d-1341553-s=4">报表日期</a></th> <th width="2%">操作</th></tr></thead> <tbody><tr class="empty"><td colspan="6">没有列表项</td></tr></tbody></table><div align="left"><span class="pagebanner">共0项</span></div><div align="right"><span class="pagelinks"></span></div>     <script type="text/javascript">      <!--       highlightTableRows("reports");      //-->     </script>      </div>      </center> </body> </html>

Socket 模拟HTTP客户端请求的更多相关文章

  1. Socket(TCP)客户端请求和服务端监听和链接基础(附例子)

    一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...

  2. php socket模拟http中post或get提交数据

    php socket模拟http中post或者get提交数据的示例代码. 代码: sock_post.php: <?php /** * php socket模拟post\get请求 * 编辑:脚 ...

  3. Python socket模拟HTTP请求

    0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很 ...

  4. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  5. socket 模拟 HTTP请求

    一.socket介绍 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层.socket则是对TCP/I ...

  6. PHP+SOCKET 模拟HTTP请求

    HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: ...

  7. 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求

    DotNet.Net.MySocket是SLB.NET(Server Load Balance服务器负载均衡)项目中的核心组件. 在实际的项目中发现,单进程的服务端处理高并发的客户请求能力有限. 所以 ...

  8. Socket模拟HTTP请求

    WEB服务器可以可以理解为socket的上层封装,其也是TCP/IP协议,只要知道其IP地址和端口号就可以与他进行通信了 与WEB服务器数据交互,其重点在于请求头,如果请求头不对则不能进行数据传输 简 ...

  9. 在Java中使用Socket模拟客户端和服务端(多线程)

    1:Socket与ServerSocket的交互 2.Socket和ServerSocket介绍 Socket 构造函数 Socket() Socket(InetAddress address, in ...

随机推荐

  1. bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四*

    bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四 题意: 平面直角坐标系有n个点,从(0,0)出发,从一个点上可以跳到所有与它横纵坐标距离都≤2的点上,求最少步数 ...

  2. easyui的组合网格:combogrid的选中事件

    jQuery EasyUI的API文档中写到: “数据表格下拉框事件完全扩展自combo(自定义下拉框)和datagrid(数据表格)” 这也就是说,我们完全可以将combo和datagrid的事件拿 ...

  3. Go Pentester - HTTP Servers(1)

    HTTP Server Basics Use net/http package and useful third-party packages by building simple servers. ...

  4. JavaScript中的var,const,let区别与用法(浅谈)

    let 和 const是(ES6) 新增加了两个重要的 JavaScript 关键字. 1.var全局变量 //全局变量在 JavaScript 程序的任何地方都可以访问 //定义的变量可以修改,如果 ...

  5. css初始化表(normalize.css)

    为什么要初始化CSS? 建站老手都知道,这是为了考虑到浏览器的兼容问题,其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面差异.当然,初始化样式会对SEO有一定的 ...

  6. 设计模式:strategy模式

    思想:将算法进行抽象,然后使用桥接的模式使用算法的抽象接口,达到算法整体替换的目的 理解:和桥接模式相同,只是桥接的两边分开的思想不同 例子: class Algrithm //算法的抽象 { pub ...

  7. Linux cut 命令详解

    cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中.我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来. 在本 ...

  8. 分布式锁(2) ----- 基于redis的分布式锁

    分布式锁系列文章 分布式锁(1) ----- 介绍和基于数据库的分布式锁 分布式锁(2) ----- 基于redis的分布式锁 分布式锁(3) ----- 基于zookeeper的分布式锁 代码:ht ...

  9. 从零开始学Python网络爬虫PDF高清完整版免费下载|百度网盘

    百度网盘:从零开始学Python网络爬虫PDF高清完整版免费下载 提取码:wy36 目录 前言第1章 Python零基础语法入门 11.1 Python与PyCharm安装 11.1.1 Python ...

  10. 数据库(十三):MySQL内置方法

    进击のpython ***** 数据库--MySQL内置方法 目录 数据库--MySQL内置方法 视图 增加 修改 删除 触发器 创建 使用 删除 存储过程 无参 有参 事务 代码实现 视图 视图是一 ...