用go语言实现程序,用http协议从服务端获取文件并保存本地,可以指定获取不同文件,客户端的使用命令例子是demo file 192.168.1.1给出服务端和客户端代码?

时间: 2024-05-03 21:17:47 浏览: 6
以下是服务端代码,使用Go语言编写,通过HTTP协议提供文件下载服务: ```go package main import ( "fmt" "io" "net/http" "os" ) func main() { http.HandleFunc("/download", func(w http.ResponseWriter, r *http.Request) { // 获取文件名 filename := r.URL.Query().Get("filename") if filename == "" { http.Error(w, "missing filename parameter", http.StatusBadRequest) return } // 打开文件 file, err := os.Open(filename) if err != nil { http.Error(w, fmt.Sprintf("failed to open file %s: %v", filename, err), http.StatusInternalServerError) return } defer file.Close() // 设置响应头 w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename)) w.Header().Set("Content-Type", "application/octet-stream") // 写入响应体 if _, err = io.Copy(w, file); err != nil { http.Error(w, fmt.Sprintf("failed to write file to response: %v", err), http.StatusInternalServerError) return } }) // 监听端口 if err := http.ListenAndServe(":8080", nil); err != nil { panic(err) } } ``` 客户端代码如下,通过HTTP协议从服务端获取文件并保存本地: ```go package main import ( "fmt" "io" "net/http" "os" ) func main() { // 获取命令行参数 if len(os.Args) != 4 { fmt.Println("usage: demo file [filename] [server address]") return } filename := os.Args[2] serverAddr := os.Args[3] // 发送请求 resp, err := http.Get(fmt.Sprintf("http://%s/download?filename=%s", serverAddr, filename)) if err != nil { fmt.Printf("failed to download file %s from server %s: %v\n", filename, serverAddr, err) return } defer resp.Body.Close() // 创建文件 file, err := os.Create(filename) if err != nil { fmt.Printf("failed to create file %s: %v\n", filename, err) return } defer file.Close() // 写入文件 if _, err = io.Copy(file, resp.Body); err != nil { fmt.Printf("failed to save file %s: %v\n", filename, err) return } fmt.Printf("file %s downloaded from server %s\n", filename, serverAddr) } ``` 使用命令 `go build` 分别编译服务端和客户端程序,然后在不同的终端窗口中启动服务端和客户端程序,即可进行文件下载。例如,启动服务端程序: ``` $ ./server ``` 启动客户端程序,并从服务端下载文件 `test.txt`: ``` $ ./client file test.txt 192.168.1.1 ```

最新推荐

recommend-type

C#微信小程序服务端获取用户解密信息实例代码

主要介绍了 C#微信小程序服务端获取用户解密信息实例代码的相关资料,需要的朋友可以参考下
recommend-type

ASP.NET Core单文件和多文件上传并保存到服务端的方法

主要介绍了ASP.NET Core单文件和多文件上传并保存到服务端的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

C#实现HTTP下载文件的方法

主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下
recommend-type

C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法

主要介绍了C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法,很实用的功能,需要的朋友可以参考下
recommend-type

Openssl实现双向认证教程(附服务端客户端代码)

第一个是当时最终的课程设计客户端是浏览器,服务端是tomcat双向认证只需要对两者进行配置并不需要自己真的实现代码。 第二个是虽然课程也有接近双向认证的实现代码,但当时是Java+JCE环境现在要用C+++OpenSSL环境,...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解答下列问题:S—>S;T|T;T—>a 构造任意项目集规范族,构造LR(0)分析表,并分析a;a

对于这个文法,我们可以构造以下项目集规范族: I0: S -> .S S -> .T T -> .a I1: S -> S. [$ T -> T. [$ I2: S -> T. I3: S -> S.;S S -> S.;T T -> T.;a 其中,点(.)表示已经被扫描过的符号,;$表示输入串的结束符号。 根据项目集规范族,我们可以构造出LR(0)分析表: 状态 | a | $ ---- | - | - I0 | s3| I1 | |acc I2 | | 其中s3表示移进到状态3,acc表示接受。在分析字符串a;a时,我们可以按照以下步骤进行
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。