思路:
1,创建监听套节字
2,阻塞等待发送端连接请求
3,读取文件名,保存
4,回执发送端“ok“
5,创建文件,保存发送端发来的数据
1)创建文件
2)从conn中读取buf
3)把buf写入新创建的文件中
4)判断文件读完写完,关闭文件,关闭conn,断开连接
package main
import (
"net"
"fmt"
"os"
)
func recvFile(fileName string, conn net.Conn) {
//1)创建文件
file, err := os.Create(fileName)
if err != nil {
fmt.Println("Create Err:", err)
return
}
defer file.Close()
buf := make([]byte, 4096)
for {
n, err := conn.Read(buf)
// 2)从conn中读取buf
if n == 0 {
//4) 判断是否读到文件末尾
fmt.Println("读取文件结束")
break
}
if err != nil {
fmt.Println("Read Err:", err)
return
}
file.Write(buf[:n])
// 3)把buf写入新创建的文件中
}
}
func main() {
//1,创建监听套节字
listener, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println("Listen Err:", err)
return
}
defer listener.Close()
// 2,阻塞等待发送端连接请求
conn, err := listener.Accept()
if err != nil {
fmt.Println("Listen Err:", err)
return
}
defer conn.Close()
buf := make([]byte, 4096)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Read Err:", err)
return
}
fileName := string(buf[:n])
//4,回执发送端“ok“
_, err = conn.Write([]byte("OK"))
if err != nil {
fmt.Println("Write Err:", err)
return
}
//5,保存发送端发来的数据
recvFile(fileName, conn)
}