Go语言中的网络编程函数
Go语言中有很多网络编程函数可以使用,比如以下几个:
1. Listen函数
Listen函数是用来监听网络地址的函数,它通常情况下会和Serve函数一起使用,这个函数返回一个Listener对象。
以下是Listen函数的用法示例:
listener, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal("Listen error:", err)
}
defer listener.Close()
这个例子里,我们使用了TCP协议,监听本机的8080端口。
2. Accept函数
Accept函数会等待一个链接的到来,并且返回一个Conn对象,这个对象可以用来读取和写入数据。
以下是Accept函数的用法示例:
conn, err := listener.Accept()
if err != nil {
continue
}
go handleConn(conn)
这个例子里,我们使用listener.Accept()等待一个链接的到来,并且将这个链接交给另一个协程去处理。
3. Dial函数
Dial函数是用来建立到一个网络地址的链接,它通常情况下会和读写操作配合使用。
以下是Dial函数的用法示例:
conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
log.Fatal("Dial error:", err)
}
defer conn.Close()
这个例子里,我们使用TCP协议建立到google.com服务器的80端口的链接。
HTTP服务器下载文件的实现
下面我们来说一说如何使用Go语言中的网络编程函数实现HTTP服务器下载文件。
1. 创建HTTP服务器
我们使用net/http包中的http.ListenAndServe函数创建一个HTTP服务器,它的参数里需要指定服务器监听的端口以及处理请求的handler函数。
以下是创建HTTP服务器的用法示例:
func main() {
http.HandleFunc("/download", downloadHandler)
log.Println("Start server on :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe error:", err)
}
}
这个例子里,我们指定了监听8080端口,并且将HTTP请求的handle交给downloadHandler函数来处理。
2. 处理HTTP请求
在downloadHandler函数里,我们可以解析出请求的URL参数,然后打开指定文件并返回给客户端。
以下是downloadHandler函数的用法示例:
func downloadHandler(w http.ResponseWriter, r *http.Request) {
path := r.URL.Query().Get("path")
if path == "" {
http.Error(w, "Path parameter is missing", http.StatusBadRequest)
return
}
file, err := os.Open(path)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer file.Close()
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filepath.Base(path)))
_, err = io.Copy(w, file)
if err != nil {
log.Println("Error copying file.")
return
}
}
这个例子里,我们首先解析出请求的URL参数path,然后打开这个文件,将其中的内容写入到ResponseWriter中,最后设置响应头Content-Disposition为attachment,这样可以让浏览器自动下载这个文件。
如果路径不存在或者读取文件出错,我们就设置HTTP响应状态码为500,并返回错误信息给客户端。
完整代码
下面是完整的HTTP服务器下载文件的实现:
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
"path/filepath"
)
func main() {
http.HandleFunc("/download", downloadHandler)
log.Println("Start server on :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe error:", err)
}
}
func downloadHandler(w http.ResponseWriter, r *http.Request) {
path := r.URL.Query().Get("path")
if path == "" {
http.Error(w, "Path parameter is missing", http.StatusBadRequest)
return
}
file, err := os.Open(path)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer file.Close()
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filepath.Base(path)))
_, err = io.Copy(w, file)
if err != nil {
log.Println("Error copying file.")
return
}
}
总结
在本文中我们介绍了Go语言中的网络编程函数的使用方法,并且使用这些函数实现了一个HTTP服务器下载文件的功能。适当地运用这些函数,我们可以快速地创建一些高性能的服务器应用。