用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
```