使用Go语言编写HTTP代理服务器

news2024/10/5 13:17:17

在Go语言中,编写一个HTTP代理服务器相对简单且直观。代理服务器的主要职责是接收客户端的请求,然后将请求转发到目标服务器,再将目标服务器的响应返回给客户端。下面是一个简单的示例,展示如何使用Go语言编写一个基本的HTTP代理服务器:

go复制代码

package main

import (

"io" 

"log" 

"net" 

"net/http" 

)

func handleRequest(w http.ResponseWriter, r *http.Request) {

// 创建到目标服务器的连接

destConn, err := net.Dial("tcp", r.Host)

if err != nil {

log.Printf("无法连接到目标服务器: %v", err)

http.Error(w, "无法连接到目标服务器", http.StatusInternalServerError)

return 

}

defer destConn.Close()

// 将客户端的请求发送到目标服务器

err = r.Write(destConn)

if err != nil {

log.Printf("请求发送失败: %v", err)

http.Error(w, "请求发送失败", http.StatusInternalServerError)

return 

}

// 将目标服务器的响应返回给客户端

buf := make([]byte, 4096)

for {

n, err := destConn.Read(buf)

if err != nil && err != io.EOF {

log.Printf("读取响应时出错: %v", err)

http.Error(w, "读取响应时出错", http.StatusInternalServerError)

return 

}

if n == 0 {

break 

}

_, err = w.Write(buf[:n])

if err != nil {

log.Printf("响应写入失败: %v", err)

http.Error(w, "响应写入失败", http.StatusInternalServerError)

return 

}

}

}

func main() {

// 创建HTTP代理服务器

proxy := &http.Server{

Addr: ":8080", // 代理服务器监听的端口号,可以根据需要进行修改

Handler: http.HandlerFunc(handleRequest),

}

log.Println("启动HTTP代理服务器,监听端口8080...")

err := proxy.ListenAndServe()

if err != nil {

log.Fatalf("代理服务器启动失败: %v", err)

}

}

这个示例代码创建了一个简单的HTTP代理服务器,它监听本地的8080端口。当客户端发送请求时,代理服务器会将请求转发到目标服务器,并将目标服务器的响应返回给客户端。请注意,这只是一个基本示例,可能需要根据实际需求进行进一步的定制和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1403305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

地方债务余额数据,Shp、excel格式,2008-2020年,含公共财政收入、支出、负债率等多个字段

基本信息: 数据名称: 地方债务余额数据 数据格式: Shp、excel 数据时间: 2008-2020年 数据几何类型: 面 数据坐标系: WGS84 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1zfzqsl地方政府债-债券数量(只)2zfzqye地方政府…

美团收银餐饮版培训教程

硬件连接方式及介绍: 双屏收银机 收银一体机 双屏收银机连接图 收银一体机连接图 前台打印机 后厨打印机 标签打印机 前台打印机连接图 后厨打印机连接图 其它收银机配件 软件前期设置 1、机器联网 点开桌面的设置,点击更多,点击以太网,最上…

杭电网课笔记

技巧 1.判断得数为整数还是小数,可以%1,得数为0是整数 或者用instanceof Integer number 9; // 自动装箱 System.out.println(number instanceof Integer); // 输出:true 2.a * b 最大公约数 * 最小公倍数 LCM 最小公倍数 GCD 最大公…

聊聊Java虚拟机(一)—— 类加载子系统

1. 前言 ​ 虚拟机就是一款用来执行虚拟计算机指令的计算机软件。它相当于一台虚拟计算机。大体上,虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机就相当于一台物理电脑,里面可以安装操作系统;程序虚拟机是为了执行单个计算机程序而设计出来…

FPGA之分布式RAM(2)

1) 128 X1 Single Port Distributed RAM 下图中可以看出来,通过2个LUT的组合使用可以串联实现更大深度的分布式RAM.下图中出现了F7BMUX的加入, F7BMUX可以用于LUT输出的选通. 原语调用: RAM128XIS#(INIT(128h00000000000000000000000000000000) // Initial conten…

动态规划——炮兵回城【集训笔记】

题目描述 游戏盘面是一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 游戏结束盘上只剩下一枚炮兵没有回到城池中&a…

ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评

ERP系统哪个好用?用友,金蝶,ORACLE,SAP综合测评 ERP领域SAP、ORACLE相对于国内厂商如用友、金蝶优势在哪? SAP,ORACLE操作习惯一般国人用不惯;相对于国产软件,界面也很难看&#x…

深入理解C语言(2):字符、字符串与内存函数

文章主题:字符、字符串与内存函数🌏所属专栏:深入理解C语言📔作者简介:更新有关深入理解C语言知识的博主一枚,记录分享自己对C语言的深入解读。😆个人主页:[₽]的个人主页&#x1f3…

buctoj——2024寒假集训 进阶训练赛 (五)

问题 A: 约瑟夫问题 题目描述 N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;……输出依次出圈的人的编号。N,M由键盘输入。 输入 一行,包含两个正整数…

C++中命名空间、缺省参数、函数重载

目录 1.命名空间 2.缺省参数 3.函数重载 1.命名空间 在C中定义命名空间我们需要用到namespace关键字,后面跟上命名空间的名字,结构框架有点类似结构体(如图所示) 上面的代码我一一进行讲解: 1.我们先来说第三行和main函…

shopee智利选品:如何在Shopee智利站点上进行有效的选品

在Shopee智利站点进行选品时,卖家需要采取一系列策略来提高产品的市场接受度和销售潜力。以下是一些建议,可以帮助卖家在Shopee智利站点上进行有效的选品。 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址(复制浏览器打开&#xf…

多场景建模:阿里多场景多任务元学习方法M2M

multi-scenario multi-task meta learning approach (M2M) 背景 广告领域大部分是针对用户建模的,像点击率预估,很少有针对广告主需求建模(广告消耗预估、活跃率/流失率预估、广告曝光量预估),广告的类型较多&#x…

GPU与SSD间的P2P DMA访问机制

基于PCIe(Peripheral Component Interconnect Express)总线连接CPU、独立GPU和NVMe SSD的系统架构。 在该架构中,PCIe Swicth支持GPU与SSD之间快速的点对点直接内存访问(peer-to-peer, p2p DMA)。通常情况下&#xff0…

Verilog基础:强度建模与net型信号的多驱动问题(三)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 四、一般情况下的net型信号的线与组合(线网多驱动) 在Verilog基础:强度建模与net型信号的多驱动问题(二&#xff0…

【Redis】更改redis中的value值

今天继续进步一点点~~ 背景:今天有个前端的同事问我,能不能在Redis中他本人登录公众号的 sessionID 加上一列openID 于是我上网查了一堆在Redis里面的命令,以及不同的客户端怎么输入命令,但是后来问了下同事,他就给我…

压缩字符串

#include <iostream> using namespace std; int main() {// 请在此输入您的代码string a;int f 1, count;cin >> a;for (int i 0; a[i]; i) {if (a[i] a[i 1]) {f 0; count 1;for (i; a[i] a[i 1]; i)count 1;cout << a[i] << count;}if (cou…

vivado JTAG链、连接、IP关联规则

JTAG链 这列出了定义板上可用的不同JTAG链。每个链都列在下面<jtag_chain>以及链的名称&#xff0c;以及定义名称和链中组件的位置&#xff1a; <jtag_chains> <jtag_chain name"chain1"> <position name"0" component"part0…

RK3568笔记十:Zlmediakit交叉编译

若该文为原创文章&#xff0c;转载请注明原文出处。 编译Zlmediakit的主要目的是想实现在RK3568拉取多路RTPS流&#xff0c;并通过MPP硬解码&#xff0c;DRM显示出来。为了实现拉取多路流选择了Zlmediakit,使用FFMEPG也可以&#xff0c;在RV1126上已经验证了可行性。 一、环境…

《Linux高性能服务器编程》笔记05

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第12章 高性能I/O框架库Libevent12.1 I/…

线程池--JAVA

虽然线程是轻量级进程&#xff0c;但是如果当创建和销毁的的频率非常之高&#xff0c;那么它也就会消耗很多的资源。 而线程池就是用来优化线程频繁创建和销毁的场景&#xff0c;减少线程创建、销毁的频率。 ExecutorService JAVA标准库为我们实现了线程池&#xff0c;Execu…