首页 > 其他分享 >使用Go语言编写HTTP代理服务器

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

时间:2024-01-17 14:32:18浏览次数:23  
标签:http log err 代理服务器 服务器 Go HTTP

使用Go语言编写HTTP代理服务器_客户端

在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,log,err,代理服务器,服务器,Go,HTTP
From: https://blog.51cto.com/u_15822686/9292794

相关文章

  • 实现HTTP请求的重定向处理
    HTTP重定向是一种常见的Web技术,用于将用户从一个URL地址导向到另一个URL地址。重定向可以用于多种目的,例如网站重新设计、临时移动页面或处理URL重写。理解如何处理HTTP重定向对于Web开发者来说是至关重要的。以下是实现HTTP请求重定向处理的基本步骤:1.确定重定向需求首先,你需要明......
  • Django如何开发网页
    Django作为一款广泛应用于Web开发的框架,其在实际项目中的表现至关重要。掌握Django的开发技巧和最佳实践,不仅可以提高开发者的编程水平,还可以为企业节省开发成本,提高项目竞争力。此外,Django框架在我国的应用也日益广泛,对我国互联网产业的发展产生了积极推动作用。因此,对Django进行......
  • 文件上传超出了tomcat的限制大小:org.apache.tomcat.util.http.fileupload.impl.FileSi
    报错的原因springBoot项目自带的tomcat对上传的文件大小有默认的限制,SpringBoot官方文档中展示:每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。解决方法SpringBoot2.0版本在【application】配置文件中加入如下代码:#maxFileSize单个数据大小spring.servlet......
  • goto语句使用场景解读
    C语言中提供了goto语句和标记跳转的标号。从实践方面讲,goto语句意义不大,大多数情况即使没有goto语句也可以很容易的写出代码。但某些场合goto语句还是用得着的,最常见的用法就是终止程序中的某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目......
  • 出现了HTTPSConnectionPool(host=‘huggingface.co‘, port=443)错误的解决方法
    在下载huggingface模型的时候,经常会出现这个错误,HTTPSConnectionPool(host=‘huggingface.co’,port=443)。如在下载Tokenizer的时候,tokenizer=AutoTokenizer.from_pretrained("csebuetnlp/mT5_multilingual_XLSum")就会出现以上的错误HTTPSConnectionPool(host=‘hug......
  • 记一次go应用在k8s pod已用内存告警不准确分析
    版权说明: 本文章版权归本人及博客园共同所有,转载请在文章前标明原文出处(https://www.cnblogs.com/mikevictor07/p/17968696.html),以下内容为个人理解,仅供参考。 一、背景起因:自监控应用凌晨告警:Pod内存使用率大于80%(规格为1c1G)。内存缓慢增长,持续到早上内存使用率停止在8......
  • go--数组
    数组的定义数组是用来存储相同唯一类型的,一组已编号且长度固定的序列数组的特点固定长度:这意味着数组不可增长、不可缩减。想要扩展数组,只能创建新数组,将原数组的元素复制到新数组。内存连续:这意味可以在缓存中保留的时间更长,搜索速度更快,是一种非常高效的数据结构,同时还意味......
  • client-go异常场景分析
    场景1:同步时连不上kube-apiserverWaitForCacheSync一直阻塞,直到成功或者控制器停止。W011513:01:55.32988118339reflector.go:535]pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:229:failedtolist*v1.Node:Get"https://192.168.0.105:6443/api/v1/no......
  • Go组合与继承
    转载:原文链接Golang是不支持继承的,因此我们在使用的时候往往使用组合。那么,组合与继承有什么区别呢?组合和继承都是面向对象编程中重要的概念。继承让一个类获得另一个类的属性和方法,形成层级关系,子类可以重用父类的功能。而组合则是将一个类的对象作为另一个类的成员变量,实现代码......
  • Google自研芯片首次交给台厂生产 | 百能云芯
    Google半导体战略有了新的走向,首次将其自家设计的手机系统单晶片(SoC)"Tensor"的测试订单委托给了台湾的京元电。这一举动打破了以往三星包揽晶圆代工与封测的模式,同时也为未来Google可能释出更多自家设计的人工智能(AI)芯片测试订单留下伏笔,象征着台湾在全球AI芯片供应链中的地位不断......