`

socket模拟http中post或者get提交数据,并获得响应数据

阅读更多
首先建立一个web工程

准备连个jsp文件试试正常的流程

testpost.jsp数据提交页面

<%@ page language="java" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  <form method="post" action="testpostresult.jsp">
    This is my JSP page. <br><br>
    <input name="name" value="fruitking"/><br><br>
    <input name="company" value="intohotel"/><br><br>
    <input type="submit" value="submit"/><br>
  </form>
  </body>
</html>

testpostresult.jsp数据响应页面

<%@ page language="java" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
    This is my JSP page. <br>
    name:<%=request.getParameter("name")%><br>
    company:<%=request.getParameter("company")%><br>
  </body>
</html>

如果用socket如何建立post提交,get提交呢?如果又获得这个http响应呢?

post提交模拟

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URLEncoder;

public class TestSocketPost {

    public static void main(String[] args) {
        BufferedWriter httpPostWriter = null;
        BufferedReader httpResponse = null;
        try {
            // form域的数据.form域的数据必须以链接形式发送
            StringBuffer formDataItems = new StringBuffer();
            formDataItems.append(URLEncoder.encode("name", "GBK"));
            formDataItems.append("=");
            formDataItems.append(URLEncoder.encode("fruitking", "GBK"));
            formDataItems.append("&");
            formDataItems.append(URLEncoder.encode("company", "GBK"));
            formDataItems.append("=");
            formDataItems.append(URLEncoder.encode("intohotel", "GBK"));
            String hostname = "localhost";// 主机,可以是域名,也可以是ip地址
            int port = 8080;// 端口
            InetAddress addr = InetAddress.getByName(hostname);
            // 建立连接
            Socket socket = new Socket(addr, port);
            // 创建数据提交数据流
            httpPostWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "GBK"));
            // 相对主机的请求地址
            String httpSubmitPath = "/icbcnet/testpostresult.jsp";
            // 发送数据头
            httpPostWriter.write("POST " + httpSubmitPath + " HTTP/1.0\r\n");
            httpPostWriter.write("Host: socket方式的post提交测试\r\n");
            httpPostWriter.write("Content-Length: " + formDataItems.length() + "\r\n");
            httpPostWriter.write("Content-Type: application/x-www-form-urlencoded\r\n");
            httpPostWriter.write("\r\n"); // 以空行作为分割
            // 发送数据
            httpPostWriter.write(formDataItems.toString());
            httpPostWriter.flush();
            // 创建web服务器响应的数据流
            httpResponse = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
            String lineStr = "";
            while ((lineStr = httpResponse.readLine()) != null) {
                System.out.println(lineStr);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (httpPostWriter != null) {
                    httpPostWriter.close();
                }
                if (httpResponse != null) {
                    httpResponse.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

get模拟

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URLEncoder;

public class TestSocketGet {

    public static void main(String[] args) {
        BufferedWriter httpGetWriter = null;
        BufferedReader httpResponse = null;
        try {
            String hostname = "localhost";// 主机,可以是域名,也可以是ip地址
            int port = 8080;// 端口
            InetAddress addr = InetAddress.getByName(hostname);
            // 建立连接
            Socket socket = new Socket(addr, port);
            // 创建数据提交数据流
            httpGetWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "GBK"));
            // 相对主机的请求地址
            StringBuffer httpSubmitPath = new StringBuffer("/icbcnet/testpostresult.jsp?");
            httpSubmitPath.append(URLEncoder.encode("name", "GBK"));
            httpSubmitPath.append("=");
            httpSubmitPath.append(URLEncoder.encode("fruitking", "GBK"));
            httpSubmitPath.append("&");
            httpSubmitPath.append(URLEncoder.encode("company", "GBK"));
            httpSubmitPath.append("=");
            httpSubmitPath.append(URLEncoder.encode("pubone", "GBK"));
            httpGetWriter.write("GET " + httpSubmitPath.toString() + " HTTP/1.1\r\n");
            httpGetWriter.write("Host: socket方式的get提交测试\r\n");
            httpGetWriter.write("\r\n");
            httpGetWriter.flush();
            // 创建web服务器响应的数据流
            httpResponse = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
            // 读取每一行的数据.注意大部分端口操作都需要交互数据。
            String lineStr = "";
            while ((lineStr = httpResponse.readLine()) != null) {
                System.out.println(lineStr);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (httpGetWriter != null) {
                    httpGetWriter.close();
                }
                if (httpResponse != null) {
                    httpResponse.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
分享到:
评论

相关推荐

    php中用socket模拟http中post或者get提交数据的示例代码

    下面的代码展示了如何使用`socket`函数模拟POST和GET请求: 1. **创建socket连接**: 首先,我们需要解析目标URL以获取主机名和端口,然后使用`fsockopen()`函数建立TCP连接。如果无法打开连接,该函数返回错误...

    使用PHP Socket 编程模拟Http post和get请求

    `post`方法与`get`类似,但是它还允许传入请求体的内容,并设置`Content-Type`和`Content-Length`头部信息,这是必须的,因为在POST请求中需要包含这些头部信息来告知服务器接收数据的类型和长度。 `request`私有...

    Android下socket模拟http server

    在Android平台上,我们可以利用Socket编程来模拟一个简单的HTTP服务器,以提供本地文件系统中的资源,如HTML文件,供外部设备(如浏览器)访问。这个过程涉及到Android系统的网络权限管理、Socket编程以及HTTP协议的...

    socket模拟HTTP协议头

    4. 可选的请求体:仅在POST请求中使用,用于发送数据到服务器。 在使用Socket模拟HTTP请求时,我们首先需要创建一个Socket实例,连接到指定的Web服务器IP地址和端口号(通常是80)。然后,我们将HTTP请求以字符串...

    模拟GET/POST方法发送HTTP请求

    POST方法则用于向服务器提交数据,如表单填写内容,这些数据被包含在请求体中,不显示在URL上。 WinSock,全称为Windows Sockets,是Windows操作系统提供的API,用于实现TCP/IP协议栈的应用程序编程接口。使用...

    模拟http服务器(socket使用)

    本文将基于提供的标题“模拟http服务器(socket使用)”和描述,深入探讨如何使用Socket来构建一个简单的HTTP服务器。我们将涵盖以下几个关键点: 1. **HTTP协议基础**: HTTP(超文本传输协议)是互联网上应用最...

    易语言-易语言基于HPSocket,一键搭建 HTTP 服务,支持POST,GET(开源)

    一旦有连接建立,HPSocket将处理接收到的数据,并根据HTTP协议解析请求方法(如GET或POST)、URL、请求头和请求体等信息。然后,服务器端根据这些信息进行相应的业务逻辑处理,如返回数据或执行特定操作。 易语言与...

    socket模拟http

    在"socket模拟http"中,开发者可能首先会创建一个基于TCP的Socket,因为HTTP是基于TCP的。然后,他们需要理解HTTP协议的基本结构和请求/响应模型。HTTP请求通常包括方法(GET、POST等)、URL、HTTP版本、头部和可选...

    C#基于socket模拟http请求的方法

    总结来说,这个代码片段展示了如何使用C#的Socket类来模拟一个基本的HTTP客户端,发送请求并接收响应,适用于学习和理解TCP/IP通信以及HTTP协议的基础操作。然而,在实际开发中,通常会使用更高级别的API,如...

    PHP中的POST&GET的应用.docx

    在PHP中,可以通过fsockopen函数创建一个socket连接来模拟POST请求。在示例代码中,我们看到`$ps`数组用于存储POST参数,然后通过`urlencode`函数编码键值对,并将它们添加到`$posts`字符串中。最后,使用`fputs`将...

    php-socket拟POST.doc

    描述中提到的“模拟get方式,直接用file_get_content就行了”,这是指在PHP中获取HTTP GET请求数据时,可以简单地使用file_get_contents函数,它会自动处理HTTP GET请求并返回响应内容。然而,对于POST请求,由于...

    socket httpclient

    2. POST方法:POST方法用于向服务器提交数据,常用于表单提交或上传文件。数据通常包含在请求体中。构造POST请求时,需要在请求头中指定Content-Type和Content-Length,然后将数据写入Socket连接。例如,"POST /form...

    tcp_http.rar_http socket_http下载_socket 下载_socket下载http_tcp http

    当我们谈论"socket下载http"时,通常是指使用Socket编程来实现HTTP客户端,模拟浏览器发送HTTP请求到服务器,然后接收服务器返回的文件数据。HTTP请求通常包括方法(如GET或POST)、URL、协议版本、头部和可能的主体...

    socket和http实例

    HTTP请求通常由方法(GET、POST等)、URL、HTTP版本、头部和可选的数据体组成,而响应则包括状态码、头部和响应体。 在标题提到的"socket和http实例"中,模拟客户端与银行之间的XML方式通讯,这里涉及到了XML(可...

    java socket 学习资料

    - 在Java Socket中实现HTTP服务器,需要解析HTTP请求(GET、POST等),并返回适当的HTTP响应。 - GET请求通常用于获取资源,POST请求用于向服务器提交数据。 - 文件上传涉及到处理multipart/form-data格式的POST...

    C语言开发Linux下web服务器(支持GET/POST,SSL,目录显示等)

    GET和POST是HTTP中最常见的两种请求方法,GET用于获取资源,POST则常用于提交数据。 在Linux环境下,C语言开发Web服务器需要对TCP/IP协议栈有深入理解。TCP是传输控制协议,负责建立可靠的数据传输连接;IP则是...

    socket 实现的静态网页http服务器

    HTTP请求由方法(GET、POST等)、URL、协议版本、头部和可能的主体组成,而响应包含状态码、头部和主体。 4. **C++控制台项目**:本项目以控制台应用程序的形式实现,意味着没有图形用户界面,交互主要通过命令行...

    php模拟POST提交的4种方法.pdf

    在PHP编程中,有时我们需要模拟HTTP POST提交,例如在测试API接口、自动化脚本或进行数据传输时。本文将详细讲解四种PHP模拟POST提交的方法。 ### 1. 使用`cURL`函数 cURL库是PHP的一个强大工具,用于处理各种网络...

Global site tag (gtag.js) - Google Analytics