• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思念以南
博客园    首页    新随笔    联系   管理    订阅  订阅

Tcp 文件传输

目录
  • client
  • server

client

package main

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

//发送文件到服务端

func SendFile(filePath string, fileSize int64, conn net.Conn) {
    f, err := os.Open(filePath)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    var count int64
    for {
        buf := make([]byte,  4<<10)
        //读取文件内容
        n, err := f.Read(buf)
        if err != nil && io.EOF == err {
            fmt.Println("文件传输完成")
            //告诉服务端结束文件接收
            conn.Write([]byte("finish"))
            return
        }
        //发送给服务端
        conn.Write(buf[:n])

        count += int64(n)
        sendPercent := float64(count) / float64(fileSize) * 100
        value := fmt.Sprintf("%.2f", sendPercent)
        //打印上传进度
        fmt.Println("文件上传:" + value + "%")
    }
}
//go build -o ClientTcp.exe main.go
func main() {
    fmt.Print("请输入文件的完整路径:")
    //创建切片,用于存储输入的路径
    var str string
    fmt.Scan(&str)
    //获取文件信息
    fileInfo, err := os.Stat(str)
    if err != nil {
        fmt.Println(err)
        return
    }
    //创建客户端连接
    conn, err := net.Dial("tcp", ":8000")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer conn.Close()
    //文件名称
    fileName := fileInfo.Name()
    //文件大小
    fileSize := fileInfo.Size()
    //发送文件名称到服务端
    conn.Write([]byte(fileName))
    buf := make([]byte,  4<<10)
    //读取服务端内容
    n, err := conn.Read(buf)
    if err != nil {
        fmt.Println(err)
        return
    }
    revData := string(buf[:n])
    if revData == "ok" {
        //发送文件数据
        SendFile(str, fileSize, conn)
    }
}

server

package main

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

func Handler(conn net.Conn) {
	buf := make([]byte, 4<<10)
	//读取客户端发送的内容
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println(err)
		return
	}
	fileName := string(buf[:n])
	//获取客户端ip+port
	addr := conn.RemoteAddr().String()
	fmt.Println(addr + ": 客户端传输的文件名为--" + fileName)
	//告诉客户端已经接收到文件名
	conn.Write([]byte("ok"))
	//创建文件
	f, err := os.Create(fileName)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()
	defer f.Close()
	//循环接收客户端传递的文件内容
	for {
		buf := make([]byte, 4<<10)
		n, _ := conn.Read(buf)
		//结束协程
		if string(buf[:n]) == "finish" {
			fmt.Println(addr + ": 协程结束")
			break
		}
		f.Write(buf[:n])
	}
}
//go build -o ServerTcp.exe main.go
func main() {
	//创建tcp监听
	listen, err := net.Listen("tcp", ":8000")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer listen.Close()

	for {
		//阻塞等待客户端
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println(err)
			return
		}
		//创建协程
		go Handler(conn)
	}
}
posted @ 2022-05-10 14:33  思念以南  阅读(85)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3