go语言实现文件传输

发送端

ackage main

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

func main() {
//获取文件属性
fmt.Println("请输入文件:")
var path string
fmt.Scan(&path)
file, err := os.Open(path)
if err != nil {
fmt.Println("os.Open err = ", err)
return
}
//获取文件属性
f, err := file.Stat()

fmt.Println(f.Name(), f.Size())

//主动连接服务器
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(f.Name()))
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
}
//接收到ok发送文件内容
if "ok" == string(buf[:n]) {
//发送文件内容
SendFile(path, conn)
}
//

}
func SendFile(path string, conn net.Conn) {
//以只读方式打开文件
f, err := os.Open(path)
if err != nil {
fmt.Println("os.Open err:", err)
return
}
//延迟关闭
defer f.Close()
//定义缓存字节切片
buf := make([]byte, 1024*4)
for {
//从文件读取数据写入到buf缓存
n, err := f.Read(buf)
if err != nil {
if err == io.EOF {
fmt.Println("文件发送完毕")
} else {
fmt.Println("f.Read err:", err)
}
return
}
//发送内容
conn.Write(buf[:n])
}

}

发送端
package main

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

func main() {
//创建一个tcp连接 , 端口为80
listener, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Listen err ", err)
return
}
//延迟关闭监听
defer listener.Close()

//堵塞等待用户连接, 这里只让用户连接一次 , 可以用for 一直监听
conn, err := listener.Accept()
if err != nil {
fmt.Println("listener.Accept err :", err)
return
}
//延迟关闭
defer conn.Close()

buf := make([]byte, 1024)

//将文件内容缓存进入buf
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err ", err)
return
}
//将缓存区里面的文件名称赋值给fileName
fileName := string(buf[:n])
//回复“ok”
conn.Write([]byte("ok"))

//接收文件内容
RecvFile(fileName, conn)

}
func RecvFile(fileName string, conn net.Conn) {
//新建文件
f, err := os.Create(fileName)
if err != nil {
fmt.Println("os.Create err:", err)
return
}
//定义缓存字节切片
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
}
if n == 0 {
fmt.Println("n==0, 文件接收完毕")
return
}
f.Write(buf[:n])
}
}


posted @ 2020-09-07 22:51  白色的番茄  阅读(464)  评论(0编辑  收藏  举报