91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang如何實現文件傳輸功能

發布時間:2023-03-30 09:45:59 來源:億速云 閱讀:74 作者:iii 欄目:編程語言

今天小編給大家分享一下Golang如何實現文件傳輸功能的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

借助TCP完成文件的傳輸,基本思路如下:

1、發送方(客戶端)向服務端發送文件名,服務端保存該文件名。

2、接收方(服務端)向客戶端返回一個消息ok,確認文件名保存成功。

3、發送方(客戶端)收到消息后,開始向服務端發送文件數據。

4、接收方(服務端)讀取文件內容,寫入到之前保存好的文件中。

Golang如何實現文件傳輸功能Golang如何實現文件傳輸功能

首先獲取文件名。借助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如何實現文件傳輸功能”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五峰| 普安县| 韩城市| 长武县| 疏勒县| 弥勒县| 泗阳县| 北碚区| 兴国县| 澜沧| 平果县| 正阳县| 新建县| 稷山县| 大足县| 东城区| 犍为县| 台江县| 大兴区| 亳州市| 乐昌市| 永德县| 余姚市| 沂水县| 惠东县| 都兰县| 巴塘县| 海口市| 宾阳县| 砀山县| 昌图县| 汪清县| 浙江省| 康乐县| 宁津县| 无为县| 基隆市| 荥经县| 额尔古纳市| 蓬溪县| 大宁县|