发送端
- 获取文件名
- 主动建立连接Dial
- 发送文件名给服务器
- 接收服务器的回执"ok"
- 判断是否"ok"
- 是"ok"发送文件内容
package main
import (
"fmt"
"os"
"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("f.Read err:", err)
}
return
}
_, err = conn.Write(buf[:n])
if err != nil {
fmt.Println("Conn.Write err:", err)
return
}
}
}
func main() {
list := os.Args
// fmt.Println(list)
filePath := list[1]
fileInfo, err := os.Stat(filePath)
if err != nil {
fmt.Println("os.Stat err:", err)
return
}
fileName := fileInfo.Name()
fmt.Println(fileName)
conn, err := net.Dial("tcp", "127.0.0.1:8008")
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 "ok" == string(buf[:n]) {
// 写文件内容给服务器
sendFile(conn, filePath)
}
}
接收端
- 创建监听socket
- 阻塞等待发送端建立连接Accept()
- 接收文件名,保存
- 回发"ok"给发送端
- 接收文件内容,写入文件中
package main
import (
"fmt"
"net"
"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() {
listener, err := net.Listen("tcp", "127.0.0.1:8008")
if err != nil {
fmt.Println("net.Listen err:", err)
return
}
defer listener.Close()
fmt.Println("等待客户端连接")
// 阻塞监听
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给发送端
_, err = conn.Write([]byte("ok"))
if err != nil {
fmt.Println("conn.Write err:", err)
return
}
// 接收文件
recvFile(conn, fileName)
}