java socket模拟http请求

我们模拟SSLSocket连接,请求博客园首页,并打印响应消息。代码引用来自《Java网络编程精解》作者:孙卫琴

写这篇博客为了说明模拟过程中出现的一些问题,模拟时请先在浏览器访问目标路径,F12查看网络,查看原始的网络请求头。

注意:

1.HTTP请求报文包含请求行、请求头部、空行、请求包体4个部分组成。

2.模拟请求头部时Accept-Encoding不要使用压缩,否则响应结果会出现乱码

3.请求头部结束使用回车换行符结束

代码如下:

package com.beluga.hello.http;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TestHttpClient {
    Socket socket = null;

    public void createSocket() {
        try {
            socket = new Socket("www.javathinker.org", 80);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void communcate() {
        // 注意这里必须制定请求方式 地址 注意空格
        StringBuffer sb = new StringBuffer("GET http://www.javathinker.org/ HTTP/1.1\r\n");
        // 以下为请求头
        sb.append("Host: www.javathinker.org\r\n");
        sb.append("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0\r\n");
        sb.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
        sb.append("Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
        // 注意这里不要使用压缩 否则返回乱码
        sb.append("Accept-Encoding: \r\n");
        sb.append("Connection: keep-alive\r\n");
        sb.append("Upgrade-Insecure-Requests: 1\r\n");
        // 注意这里要换行结束请求头
        sb.append("\r\n");
        System.out.println(sb.toString());
        try {
            OutputStream os = socket.getOutputStream();
            os.write(sb.toString().getBytes());

            InputStream is = socket.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int len = -1;
            while ((len = is.read(bytes)) != -1) {
                baos.write(bytes, 0, len);
            }
            System.out.println(new String(baos.toByteArray()));
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestHttpClient client = new TestHttpClient();
        client.createSocket();
        client.communcate();
    }
}
时间: 2024-12-21 09:49:11

java socket模拟http请求的相关文章

使用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 模拟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)

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 字符串很长时可以

Java socket模拟HTTP协议客户端之POST请求

相比于GET请求,POST报文多了如下几个要素: 1,Content-Length,这个是上送报文的长度,以字节为单位 2,Content-Type,这主要是涉及到报文的格式和字符集. 3,就是主报文 主类SimpleHttpPost: package com.zws.http; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSock

用socket 模拟http请求

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; class HttpHelper { #region 模拟客户端socket连接 private static Socket ConnectSocket(string server

java socket 模拟im 即时通讯

自己想了一下怎么实现,就写了,没有深究是否合理.更多处理没有写下去,例如收件人不在线,应该保存在数据库,等下一次连接的时候刷新map,再把数据发送过去,图片发送也没有做,也没有用json格式 socket很奇怪,我用客户端连接上了服务器,没有发送消息的情况下,断开电脑网络,是不会出现问题,然后在把电脑网络连接上,通讯依然正常,正常断开也不出问题,但是用idea直接按stop键,那么服务端就会出问题了,读取事件会一直为true,造成死循环,消耗CPU,所以必须要判断一下客户端连接是否断开了 只需要

Java socket模拟聊天程序

 根据TCP/IP协议,通过socket实现网络聊天,分为服务器端和客户端,一下是参考程序. 服务器端程序: package com.michael.contact; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.ne

PHP socket模拟POST请求

<?php if (! function_exists ( 'socket_post' )) { function socket_post($url, $data, $referer = '') { if (! is_array ( $data )) { return; } $data = http_build_query ( $data ); $url = parse_url ( $url ); if (empty ( $url ['scheme'] ) || $url ['scheme']