分享golang实现文件传输小demo


本文摘自php中文网,作者藏色散人,侵删。

下面由golang教程栏目给大家分享golang实现文件传输小demo ,希望对需要的朋友有所帮助!

获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者。

发送者:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

package main

 

import (    "fmt"

    "io"

    "net"

    "os")

 

func main() {

    fmt.Println("请输入接收者地址(IP:PORT):")    var addr string

    fmt.Scan(&addr)

    fmt.Println("请输入需要传输的文件:")    var path string

    fmt.Scan(&path)

    info, errf := os.Stat(path)    if errf != nil{

        fmt.Println("os.Stat errf =", errf)        return

    }

 

    conn, err := net.Dial("tcp", addr)    if err != nil{

        fmt.Println("net.Dial err =",err)        return

    }

    defer conn.Close()

 

    _, err = conn.Write([]byte(info.Name()))    if err != nil{

        fmt.Println("conn.Write info.Name err =",err)        return

    }    var n int

    buf := make([]byte, 1024)

    n, err = conn.Read(buf)    if err != nil{

        fmt.Println("conn.Read ok err =", err)        return

    }    if "ok" == string(buf[:n]){

        fmt.Println("ok")

        SendFile(path, conn)

    }

}

 

func SendFile(path string, conn net.Conn){

     file , err := os.Open(path)     if err != nil{

         fmt.Println("os.Open err =", err)         return

     }

     defer file.Close()

     buf := make([]byte, 1024 * 4)     for {

         n, err := file.Read(buf)         if err != nil{             if err == io.EOF{

                 fmt.Println("文件发送完毕")

            } else{

                fmt.Println("file.Read err =",err)

            }             return

         }         if n == 0{

             fmt.Println("文件发送完毕")             break

         }

         conn.Write(buf[:n])

     }

}

接收者:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

package main

 

import (    "fmt"

    "io"

    "net"

    "os")

 

func main() {

    fmt.Println("请你的地址(IP:PORT):")    var addr string

    fmt.Scan(&addr)

    listenner, err := net.Listen("tcp", addr)    if err != nil{

        fmt.Println("net.Listen err =", err)        return

    }

    defer listenner.Close()

 

    conn, errl := listenner.Accept()    if errl != nil{

        fmt.Println("listenner.Accept err =", errl)        return

    }    var n int

    buf := make([]byte, 1024)

    n, err = conn.Read(buf)    if err != nil{

        fmt.Println("conn.Read fileName err =", err)        return

    }

    fileName := string(buf[:n])

    n, err = conn.Write([]byte("ok"))    if err != nil{

        fmt.Println("conn.Write ok err =", err)        return

    }

 

    RecvFile(fileName, conn)

}

 

func RecvFile(fileName string, conn net.Conn){

     file , err := os.Create(fileName)     if err != nil{

         fmt.Println("os.Create err =", err)         return

     }

 

     defer file.Close()

 

     buf := make([]byte, 1024 * 4)     for{

         n, err := conn.Read(buf)         if err != nil{             if err == io.EOF{

                 fmt.Println("文件接收完成")

            } else {

                fmt.Println("conn.Read err =", err)

            }            return

        }

 

         n, err = file.Write(buf[:n])         if err != nil{

             fmt.Println("file.Write err =", err)             break

        }

     }

}

以上就是分享golang实现文件传输小demo的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

龙芯go!go!go!——龙芯平台上构建go语言环境指南

golang有类(class)吗?

手撸golang 基本数据结构与算法 堆

手撸golang 基本数据结构与算法 数组

golang的压测工具 hey

go语言学习(四):数组和切片

聊聊dubbo-go-proxy的client

tools easily execute sql against structured text like csv or tsv

go wails 框架构建桌面应用示例

大型迷惑现场之[]*t是什么?*[]t是什么?*[]*t又是什么?

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...