首页 > 编程语言 >用Java开发HTTP代理服务器

用Java开发HTTP代理服务器

时间:2023-05-31 12:03:26浏览次数:45  
标签:HTTP Java 代理服务器 serverSocket 服务器 new 客户端

HTTP代理服务器是一种网络应用,它充当位于客户端和目标服务器之间的中间节点,将客户端发出的HTTP请求转发给目标服务器,并将目标服务器返回的HTTP响应内容回传给客户端。通过使用代理服务器,客户端可以避免直接访问目标服务器,从而更加安全地访问互联网资源。

用Java开发HTTP代理服务器_爬虫池

以下是使用 Java 开发 HTTP 代理服务器的一般步骤:

1、创建 ServerSocket,并监听指定端口(如8080)的客户端连接请求。

2、接受客户端请求,创建 Socket 对象与客户端进行通信。

3、从客户端发送来的 HTTP 请求报文中提取请求头中的目标服务器地址和端口号等信息。

4、向目标服务器发起一个新的 HTTP 请求,并将客户端请求报文中的头信息以及消息体一并发送给目标服务器。

5、等待目标服务器返回响应报文,然后将其解析并在回复给客户端之前做一些处理,如根据 Cache-Control 头判断响应是否可缓存等。

6、将从目标服务器收到的响应头转发给客户端,随后将服务器返回的数据流转发给客户端。

7、关闭与目标服务器的连接,在关闭与客户端的连接前需要确保已经将所有数据都发送给了客户端。

下面是一个简单的 Java 代码示例:

import java.io.*;
import java.net.*;

public class HttpProxyServer {
    private final int BUFFER_SIZE = 2048;

    public void start(int port) {
        // 创建ServerSocket并绑定到特定的端口
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("HTTP proxy server listening on port " + port);

            while (true) {
                Socket clientSocket = serverSocket.accept();

                Thread thread = new Thread(() -> {
                    try (
                        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                        DataOutputStream outToClient = new DataOutputStream(clientSocket.getOutputStream());
                        Socket serverSocket = new Socket();
                    ) {
                        // 从客户端请求报文中提取目标服务器地址和端口号
                        String requestLine = inFromClient.readLine();
                        if (requestLine == null) {
                            return;
                        }

                        String[] requestLineParts = requestLine.split(" ");
                        String targetHost = requestLineParts[1];
                        int targetPort = 80;

                        int portIndex = targetHost.indexOf(':');
                        if (portIndex > 0) {
                            targetPort = Integer.parseInt(targetHost.substring(portIndex + 1));
                            targetHost = targetHost.substring(0, portIndex);
                        }

                        serverSocket.connect(new InetSocketAddress(targetHost, targetPort));

                        // 转发客户端请求头数据到目标服务器
                        byte[] requestBuffer = new byte[BUFFER_SIZE];
                        int bytesReceived = inFromClient.read(requestBuffer);
                        serverSocket.getOutputStream().write(requestBuffer, 0, bytesReceived);

                        // 转发目标服务器响应头数据到客户端
                        byte[] responseBuffer = new byte[BUFFER_SIZE];
                        bytesReceived = serverSocket.getInputStream().read(responseBuffer);
                        outToClient.write(responseBuffer, 0, bytesReceived);

                        // 转发目标服务器响应数据到客户端
                        while ((bytesReceived = serverSocket.getInputStream().read(responseBuffer)) != -1) {
                            outToClient.write(responseBuffer, 0, bytesReceived);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
                thread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        HttpProxyServer proxy = new HttpProxyServer();
        proxy.start(8080);
        # 建IP池(http://jshk.com.cn/mb/reg.asp?kefu=xjy)
    }
}

在上面的示例中,使用了 Java 的 Socket API 来创建 HTTP 代理服务器。程序主要通过对客户端请求报文和目标服务器响应报文进行解析和重构来实现代理服务的功能。需要注意的是,这个简单的代理服务器并没有实现对 HTTPS 请求的支持和加密数据传输等安全性控制措施,实际应用还需要做更多的细节处理和安全保护。

标签:HTTP,Java,代理服务器,serverSocket,服务器,new,客户端
From: https://blog.51cto.com/u_13488918/6385864

相关文章

  • java springboot 项目中静态资源无法访问的问题
    默认resource/static目录下的静态html文件无法访问,需要配置。您可以在SpringBoot的配置类中添加以下内容来手动配置静态资源目录:@ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddResourceHandlers(ResourceHan......
  • java简单实现布隆过滤器
    为了方便理解布隆过滤器,java简单实现了下,特点:仅用做一次运算就可以判断存在不存在,但是只能精确的判断值不存在,不能精确的判断值存在publicclassBlTest{privatefinalintf=1024;//负载因子,值越大判断的越精准,但是所占的空间也越大int[]bArray;BlTest(){......
  • Java大文件分片上传/多线程上传解决方案
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • java面试题
    一、面向对象的特性有哪些?封装(Encapsulation):将数据和方法封装在一个类中,通过访问修饰符控制数据的访问权限,提高程序的安全性和可维护性。继承(Inheritance):可以从父类继承属性和方法,避免重复编写代码,简化程序设计和维护。多态(Polymorphism):同一种类型的对象,可以以不同的方式......
  • java轻型内存队列处理demo
    java轻型内存队列处理demo@ComponentpublicclassConcurrentLinkedQueueUtils{staticAtpLogBizatpLogBiz;staticAuditLogtTmpDataServiceauditLogDataService;staticConcurrentLinkedQueueconList=newConcurrentLinkedQueue();privatestaticvo......
  • java中属性和局部变量的作用域
    1.类中的属性和局部变量可以重名,访问时遵循就近原则2.在同一个作用域中({}大括号括起来的),如在一个成员方法中,两个局部变量不能重名3.属性的生命周期长,随着对象的创建而创建,随着对象的销毁而销毁;局部变量的生命周期短,随着它所属的代码块执行而创建,随着代码快的结束而销毁。......
  • java同步mysql的数据到PostgreSQL时报错ERROR: invalid byte sequence for encoding "
    最近,同事在做一个功能,通过java程序将mysql中的一张表的数据同步到pgsql中,在同步过程中,插入到pgsql中出现了如下错误:`###Errorupdatingdatabase.Cause:org.postgresql.util.PSQLException:ERROR:invalidbytesequenceforencoding"UTF8":0x00在位置:unnamedportalpa......
  • java modbus_rtu串口通讯
    基于modbus和串口通讯的Java分享本文推荐一个简单好用java实现基于modbus—rtu协议通讯方法:如果采用非标准modbus协议通讯,可以查看我的这篇博文:java实现串口通讯关于modbus的java开源库主要有以下四种:Jamod:JavaModbus实现:JavaModbus库。该库由DieterWimberger实施。Mod......
  • Charles 4.2.1 HTTPS抓包
    Charles4.2.1HTTPS抓包 Charles iPhone抓包Mac必须与iPhone连接同一WiFiProxy -> SSLProxyingSettings -> SSLProxying -> Add  Host:为需要过滤的域名地址,*表示不过滤Port:固定为443,*表示任意端口查看Mac IP地址,iPhone添加代理Safari访问chls.pro/ssl,安装......
  • Java 删除某个目录下面所有的文件
    Java删除某个目录下面所有的文件 FilecodeDir=newFile("C:\\111111");deleteContents(codeDir);//删除111111目录下面所有内容,但不删除111111这个目录deleteContentsAndDir(codeDir);//删除111111目录下面所有内容,最后将111111这个......