欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang實現(xiàn)文件傳輸功能

 更新時間:2022年07月26日 10:05:05   作者:itzhuzhu.  
這篇文章主要為大家詳細介紹了Golang實現(xiàn)文件傳輸功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Golang實現(xiàn)文件傳輸?shù)木唧w代碼,供大家參考,具體內容如下

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

1、發(fā)送方(客戶端)向服務端發(fā)送文件名,服務端保存該文件名。
2、接收方(服務端)向客戶端返回一個消息ok,確認文件名保存成功。
3、發(fā)送方(客戶端)收到消息后,開始向服務端發(fā)送文件數(shù)據(jù)。
4、接收方(服務端)讀取文件內容,寫入到之前保存好的文件中。

首先獲取文件名。借助os包中的stat()函數(shù)來獲取文件屬性信息。在函數(shù)返回的文件屬性中包含文件名和文件大小。Stat參數(shù)name傳入的是文件訪問的絕對路徑。FileInfo中的Name()函數(shù)可以將文件名單獨提取出來。

func Stat(name string) (FileInfo, error)?
type FileInfo interface {
? ?Name() string ? ? ??
? ?Size() int64 ? ? ? ?
? ?Mode() FileMode ? ??
? ?ModTime() time.Time?
? ?IsDir() bool ? ? ? ?
? ?Sys() interface{} ??
}

發(fā)送端:

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()

?? ?// 從本文件中,讀數(shù)據(jù),寫給網(wǎng)絡接收端。 讀多少,寫多少。原封不動。
?? ?buf := make([]byte, 1024)
?? ?for {
?? ??? ?n, err := f.Read(buf)
?? ??? ?if err != nil {
?? ??? ??? ?if err == io.EOF {
?? ??? ??? ??? ?fmt.Println("發(fā)送文件完成。")
?? ??? ??? ?} else {
?? ??? ??? ??? ?fmt.Println("os.Open err:", err)
?? ??? ??? ?}
?? ??? ??? ?return
?? ??? ?}
?? ??? ?// 寫到網(wǎng)絡socket中
?? ??? ?_, err = conn.Write(buf[:n])
?? ??? ?if err != nil {
?? ??? ??? ?fmt.Println("conn.Write err:", err)
?? ??? ??? ?return
?? ??? ?}
?? ?}
}

func main() {
?? ?list := os.Args // 獲取命令行參數(shù)

?? ?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()

?? ?// 主動發(fā)起連接請求
?? ?conn, err := net.Dial("tcp", "127.0.0.1:8000")
?? ?if err != nil {
?? ??? ?fmt.Println("net.Dial err:", err)
?? ??? ?return
?? ?}
?? ?defer conn.Close()

?? ?// 發(fā)送文件名給 接收端
?? ?_, err = conn.Write([]byte(fileName))
?? ?if err != nil {
?? ??? ?fmt.Println("conn.Write err:", err)
?? ??? ?return
?? ?}
?? ?// 讀取服務器回發(fā)的 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) {
?? ?// 按照文件名創(chuàng)建新文件
?? ?f, err := os.Create(fileName)
?? ?if err != nil {
?? ??? ?fmt.Println("os.Create err:", err)
?? ??? ?return
?? ?}
?? ?defer f.Close()

?? ?// 從 網(wǎng)絡中讀數(shù)據(jù),寫入本地文件
?? ?buf := make([]byte, 1024)
?? ?for {
?? ??? ?n, _ := conn.Read(buf)
?? ??? ?if n == 0 {
?? ??? ??? ?fmt.Println("接收文件完成。")
?? ??? ??? ?return
?? ??? ?}
?? ??? ?// 寫入本地文件,讀多少,寫多少。
?? ??? ?f.Write(buf[:n])
?? ?}
}

func main() {
?? ?// 創(chuàng)建用于監(jiān)聽的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("接收端啟動成功,等待發(fā)送端發(fā)送文件!")

?? ?// 阻塞監(jiān)聽
?? ?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 給發(fā)送端
?? ?conn.Write([]byte("ok"))

?? ?// 獲取文件內容
?? ?recvFile(conn, fileName)
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 基于Go語言實現(xiàn)應用IP防火墻

    基于Go語言實現(xiàn)應用IP防火墻

    在公司里面經(jīng)常會聽到某應用有安全漏洞問題,沒有做安全加固,IP防火墻就是一個典型的安全加固解決方案,下面我們就來學習一下如何使用go語言實現(xiàn)IP防火墻吧
    2023-11-11
  • golang對自定義類型進行排序的解決方法

    golang對自定義類型進行排序的解決方法

    學習一門編程語言,要掌握原子數(shù)據(jù)類型,還需要掌握自定義數(shù)據(jù)類型。下面這篇文章主要給大家介紹了關于golang如何對自定義類型進行排序的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • go?defer避坑指南之拆解延遲語句

    go?defer避坑指南之拆解延遲語句

    這篇文章主要為大家詳細介紹了go?defer避坑指南之如何拆解延遲語句,掌握正確使用方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • Golang應用程序性能優(yōu)化技巧分享

    Golang應用程序性能優(yōu)化技巧分享

    隨著科技的進步,人人都想要快速的應用,這就需要優(yōu)化您的應用程序性能。本文為大家整理了一些Golang應用程序性能優(yōu)化的技巧,希望對大家有所幫助
    2023-04-04
  • Go語言開發(fā)kube-scheduler整體架構深度剖析

    Go語言開發(fā)kube-scheduler整體架構深度剖析

    這篇文章主要為大家介紹了Go語言開發(fā)kube-scheduler整體架構深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 一文詳解Golang中的基礎語法

    一文詳解Golang中的基礎語法

    這篇文章主要為大家詳細介紹了Golang中基礎語法的相關知識,文中的示例代碼講解詳細,對我們學習Golang有一定的幫助,感興趣的可以了解一下
    2023-03-03
  • 關于go語言載入json可能遇到的一個坑

    關于go語言載入json可能遇到的一個坑

    Go 語言從新手到大神,每個人多少都會踩一些坑,那么下面這篇文章主要給大家介紹了關于go語言載入json可能遇到的一個坑,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Go Gin框架中的路由組及其優(yōu)先級探索分析

    Go Gin框架中的路由組及其優(yōu)先級探索分析

    在構建Web應用程序時,理解和有效地使用路由是至關重要的,Go語言的Gin框架為此提供了強大的工具,特別是通過其路由組功能,本文將深入探討Gin的RouterGroup,特別是在路徑匹配和優(yōu)先級方面的行為
    2024-01-01
  • Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    這篇文章主要介紹了Linux系統(tǒng)下Go開發(fā)環(huán)境搭建,需要的朋友可以參考下
    2022-04-04
  • 分布式架構在Go語言網(wǎng)站的應用

    分布式架構在Go語言網(wǎng)站的應用

    分布式架構是目前應對高流量、高并發(fā)的重要解決方案,分布式架構的核心思想是分而治之,將單臺服務器的資源劃分為多臺服務器進行協(xié)同完成,分布式架構應用于Go語言網(wǎng)站中既能提升服務速度,又能降低了服務器宕機的風險
    2024-01-01

最新評論