Socket 模拟HTTP客户端请求

 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.io.OutputStreamWriter;
 4 import java.net.InetAddress;
 5 import java.net.Socket;
 6 import java.net.UnknownHostException;
 7 import java.util.ArrayList;
 8
 9 /**
10  * 一个简单的HTTP客户端,发送HTTP请求,模拟浏览器 可打印服务器发送过来的HTTP消息
11  */
12 public class HttpClient {
13     private static String encoding = "UTF-8";
14
15     public static void main(String[] args) {
16         try {
17             Socket s = new Socket(InetAddress.getLocalHost(), 8080);
18             OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream());
19             StringBuffer sb = new StringBuffer();
20             sb.append("GET /slsint_gd/reportview/reportViewList.jsp HTTP/1.1\r\n");
21             sb.append("Host: localhost:8088\r\n");
22             sb.append("Connection: Keep-Alive\r\n");
23             // 注,这是关键的关键,忘了这里让我搞了半个小时。这里一定要一个回车换行,表示消息头完,不然服务器会等待
24             sb.append("\r\n");
25             osw.write(sb.toString());
26             osw.flush();
27
28             // --输出服务器传回的消息的头信息
29             InputStream is = s.getInputStream();
30             String line = null;
31             int contentLength = 0;// 服务器发送回来的消息长度
32             // 读取所有服务器发送过来的请求参数头部信息
33             do {
34                 line = readLine(is, 0);
35                 // 如果有Content-Length消息头时取出
36                 if (line.startsWith("Content-Length")) {
37                     contentLength = Integer.parseInt(line.split(":")[1].trim());
38                 }
39                 // 打印请求部信息
40                 System.out.print(line);
41                 // 如果遇到了一个单独的回车换行,则表示请求头结束
42             } while (!line.equals("\r\n"));
43
44             // --输消息的体
45             System.out.print(readLine(is, contentLength));
46
47             // 关闭流
48             is.close();
49
50         } catch (UnknownHostException e) {
51             e.printStackTrace();
52         } catch (IOException e) {
53             e.printStackTrace();
54         }
55     }
56
57     /*
58      * 这里我们自己模拟读取一行,因为如果使用API中的BufferedReader时,它是读取到一个回车换行后
59      * 才返回,否则如果没有读取,则一直阻塞,直接服务器超时自动关闭为止,如果此时还使用BufferedReader
60      * 来读时,因为读到最后一行时,最后一行后不会有回车换行符,所以就会等待。如果使用服务器发送回来的
61      * 消息头里的Content-Length来截取消息体,这样就不会阻塞
62      *
63      * contentLe 参数 如果为0时,表示读头,读时我们还是一行一行的返回;如果不为0,表示读消息体,
64      * 时我们根据消息体的长度来读完消息体后,客户端自动关闭流,这样不用先到服务器超时来关闭。
65      */
66     private static String readLine(InputStream is, int contentLe) throws IOException {
67         ArrayList lineByteList = new ArrayList();
68         byte readByte;
69         int total = 0;
70         if (contentLe != 0) {
71             do {
72                 readByte = (byte) is.read();
73                 lineByteList.add(Byte.valueOf(readByte));
74                 total++;
75             } while (total < contentLe);// 消息体读还未读完
76         } else {
77             do {
78                 readByte = (byte) is.read();
79                 lineByteList.add(Byte.valueOf(readByte));
80             } while (readByte != 10);
81         }
82
83         byte[] tmpByteArr = new byte[lineByteList.size()];
84         for (int i = 0; i < lineByteList.size(); i++) {
85             tmpByteArr[i] = ((Byte) lineByteList.get(i)).byteValue();
86         }
87         lineByteList.clear();
88
89         return new String(tmpByteArr, encoding);
90     }
91 }

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>

时间: 2024-11-03 22:32:59

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

socket + pcntl_fork 实现客户端请求,服务器实时监听返回处理 消息推送

<?php /* socket链接整个过程 1,socket_create 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET: 第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM.数据报套接字类型为SOCK_DGRAM.原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部): 第三个参数指定应用程序所使用的通信协议.此参数可以指定单个协议系列中的不同传输协议.在Inter

Java 利用 Socket 实现服务器客户端聊天

Socket是网络编程中最基本的通信接口,常用的网络辅助类,比如URL等之类,其底层还是基于Socket来实现的. 而Socket,形象来说,就是连接通信的两端,比如这样 S<==>S,中间的通道就是网络了,而简单地利用Socket,我们就可以来实现一个简单的聊天功能 具体效果看下图: 这只是在本地中试用的效果,如果加上UI界面,其实就可以做成一个聊天的小应用了. 1. Server 端主要是利用ServerSocket的accept方法来等待客户端的连接,如果客户一直没有连接,则会在这里等待

PHP+SOCKET 模拟HTTP请求

HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: POST .GET  .HEADE.  PUT.  TRACE  .DELETE .OPTIONS .CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持. GET   基本一致,请求指定的页面信息,并返回实体主体. HEAD  基本和GET一致 ,只不过返回的响

Python socket模拟HTTP请求

0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很奇怪的问题,对同一个URL,POST请求能正常返回信息,而一旦切到GET,socket time out. 伪代码如下: get_str = 'GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)

利用socket模拟http的混合表单上传(在一个请求中提交表单并上传多个文件)

在很多企业级应用中,我们都没法直接通过开发语言sdk包封装的http工具来模拟http复合表单(multipart/form-data),特别是在跨语言跨平台的编程过程中,其实实现方案并不复杂,只要你了解了http协议中复合表单的报文结构就很简单了: httpheader ------时间戳------ 表单参数1 ------时间戳------ 表单参数2 ------时间戳------ 文件1的描述+二进制信息 ------时间戳------ 文件2的描述+二进制信息 下面我们进一步以一段c

telnet客户端模拟浏览器发送请求

telnet 客户端 telnet客户端能够发出请求去连接服务器(模拟浏览器) 使用telnet之前,需要开启telnet客户端 1.进入控制面板 2.进入程序和功能,选择打开或关闭windows功能 3.进入后找到telnet客户端,点击确定 模拟浏览器发出http协议请求 1.打开telnet客户端:进入cmd 2.连接apache服务器 语法:telnet localhost port(telnet localhost 80) 3.数据回显 3.1同时按住:ctrl+右中括号 3.2按下回

python用socket模拟post请求

今天用python的socket模拟了下post请求,通过这个实例可以更加了解python中socket的使用,以及http请求和socket的相互关系等知识. #coding=utf-8 import socket if __name__=="__main__": s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.xxxxx.com",80)) #pyhon 字符串很长时可以

使用socket模拟Http请求

这里举一个简单的例子,使用socket来模拟一段http访问百度代码 封装的工具类如下,方法叫XHttp() package com.spider.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socke

php+socket模拟表单发送请求

1 <?php 2 /** 3 * http请求类(php + socket) 4 * @todo 这里还有很多未完善的地方,仅有简单的get post head请求 5 * @author [email protected] 6 * @version 1.0.0 7 */ 8 9 class HttpClient { 10 11 const CRLF = "\r\n"; 12 private $fh = null; //socket handle 13 private $err