tcp模式下的文件传输 发送端和接受端代码

发送端

发送端
package main


import (
    "os"
    "fmt"
    "net"
    "io"
)

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, 4096)
    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", "192.168.15.44:5880")
    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, 16)
    n, err := conn.Read(buf)
    if err != nil {
        fmt.Println("conn.Read err:", err)
        return
    }

    if "start" == string(buf[:n]) {
        // 写文件内容给服务器——借助conn
        sendFile(conn, filePath)
    }
}

接受端

package main

import (
    "net"
    "fmt"
    "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, 4096)
    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:8008")
    if err != nil {
        fmt.Println(" net.Listen err:", err)
        return
    }
    defer listener.Close()

    // 阻塞监听
    conn, err := listener.Accept()
    if err != nil {
        fmt.Println(" listener.Accept() err:", err)
        return
    }
    defer conn.Close()

    // 获取文件名,保存
    buf := make([]byte, 4096)
    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)
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值