您好,登錄后才能下訂單哦!
今天小編給大家分享一下Golang如何實現文件傳輸功能的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
借助TCP完成文件的傳輸,基本思路如下:
1、發送方(客戶端)向服務端發送文件名,服務端保存該文件名。
2、接收方(服務端)向客戶端返回一個消息ok,確認文件名保存成功。
3、發送方(客戶端)收到消息后,開始向服務端發送文件數據。
4、接收方(服務端)讀取文件內容,寫入到之前保存好的文件中。
首先獲取文件名。借助os包中的stat()函數來獲取文件屬性信息。在函數返回的文件屬性中包含文件名和文件大小。Stat參數name傳入的是文件訪問的絕對路徑。FileInfo中的Name()函數可以將文件名單獨提取出來。
func Stat(name string) (FileInfo, error)
type FileInfo interface {
Name() string
Size() int64
Mode() FileMode
ModTime() time.Time
IsDir() bool
Sys() interface{}
}
發送端:
package main
import (
"fmt"
"io"
"net"
"os"
)
func sendFile(conn net.Conn, filePath string) {
// 只讀打開文件
f, err := os.Open(filePath)
if err != nil {
fmt.Println("os.Open err:", err)
return
}
defer f.Close()
// 從本文件中,讀數據,寫給網絡接收端。 讀多少,寫多少。原封不動。
buf := make([]byte, 1024)
for {
n, err := f.Read(buf)
if err != nil {
if err == io.EOF {
fmt.Println("發送文件完成。")
} else {
fmt.Println("os.Open err:", err)
}
return
}
// 寫到網絡socket中
_, err = conn.Write(buf[:n])
if err != nil {
fmt.Println("conn.Write err:", err)
return
}
}
}
func main() {
list := os.Args // 獲取命令行參數
if len(list) != 2 {
fmt.Println("格式為:go run xxx.go 文件絕對路徑")
return
}
// 提取 文件的絕對路徑
filePath := list[1]
//提取文件名
fileInfo, err := os.Stat(filePath)
if err != nil {
fmt.Println("os.Stat err:", err)
return
}
fileName := fileInfo.Name()
// 主動發起連接請求
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Dial err:", err)
return
}
defer conn.Close()
// 發送文件名給 接收端
_, err = conn.Write([]byte(fileName))
if err != nil {
fmt.Println("conn.Write err:", err)
return
}
// 讀取服務器回發的 OK
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
if "ok" == string(buf[:n]) {
// 寫文件內容給服務器——借助conn
sendFile(conn, filePath)
}
}
接收端:
package main
import (
"fmt"
"net"
"os"
)
func recvFile(conn net.Conn, fileName string) {
// 按照文件名創建新文件
f, err := os.Create(fileName)
if err != nil {
fmt.Println("os.Create err:", err)
return
}
defer f.Close()
// 從 網絡中讀數據,寫入本地文件
buf := make([]byte, 1024)
for {
n, _ := conn.Read(buf)
if n == 0 {
fmt.Println("接收文件完成。")
return
}
// 寫入本地文件,讀多少,寫多少。
f.Write(buf[:n])
}
}
func main() {
// 創建用于監聽的socket
listener, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println(" net.Listen err:", err)
return
}
defer listener.Close()
fmt.Println("接收端啟動成功,等待發送端發送文件!")
// 阻塞監聽
conn, err := listener.Accept()
if err != nil {
fmt.Println(" listener.Accept() err:", err)
return
}
defer conn.Close()
// 獲取文件名,保存
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println(" conn.Read err:", err)
return
}
fileName := string(buf[:n])
// 回寫 ok 給發送端
conn.Write([]byte("ok"))
// 獲取文件內容
recvFile(conn, fileName)
}
以上就是“Golang如何實現文件傳輸功能”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。