服务端
package main
import (
"io"
"os"
"net"
"fmt"
)
func revFile (fileName string, conn net.Conn) {
defer conn.Close()
fs,err := os.Create(fileName)
defer fs.Close()
if err != nil {
fmt.Println("os.Create err =",err)
return
}
// 拿到数据
buf := make([]byte ,1024*10)
for {
n,err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err =",err)
if err == io.EOF {
fmt.Println("文件结束了",err)
}
return
}
if n == 0 {
fmt.Println("文件结束了",err)
return
}
fs.Write(buf[:n])
}
}
func main ( ) {
// 创建一个服务器
Server,err := net.Listen("tcp","192.168.1.11:8000")
if err != nil {
fmt.Println("net.Listen err =",err)
return
}
defer Server.Close()
// 接受文件名
for {
conn, err := Server.Accept()
defer conn.Close()
if err != nil {
fmt.Println("Server.Accept err =",err)
return
}
buf := make([]byte ,1024)
n,err1 := conn.Read(buf)
if err1 != nil {
fmt.Println("conn.Read err =", err1)
return
}
// 拿到了文件的名字
fileName := string(buf[:n])
// 返回ok
conn.Write([]byte ("ok"))
// 接收文件,
revFile(fileName,conn)
}
}
客户端
package main
import (
"net"
"fmt"
"os"
)
func sendFile (path string,conn net.Conn) {
defer conn.Close()
fs,err := os.Open(path)
defer fs.Close()
if err != nil {
fmt.Println("os.Open err = ", err)
return
}
buf := make([]byte,1024*10)
for{
// 打开之后读取文件
n, err1:= fs.Read(buf)
if err1 != nil {
fmt.Println("fs.Open err = ", err1)
return
}
// 发送文件
conn.Write(buf[:n])
}
}
func main ( ) {
for {
fmt.Println("请输入一个全路径的文件,比如,D:\\a.jpg")
// 获取命令行参数
var path string
fmt.Scan(&path)
// 获取文件名,
info,err := os.Stat(path);
if err != nil {
fmt.Println("os.Stat err = ",err)
return
}
// 发送文件名
conn, err1 := net.Dial("tcp","192.168.1.11:8000")
defer conn.Close()
if err1 != nil {
fmt.Println("net.Dial err = ",err1)
return
}
conn.Write([]byte (info.Name()))
// 接受到是不是ok
buf := make([]byte,1024)
n , err2 := conn.Read(buf)
if err2 != nil {
fmt.Println("conn.Read err = ",err2)
return
}
if "ok" == string(buf[:n]) {
fmt.Println("成功");
sendFile(path,conn)
}
// 如果是ok,那么开启一个连接,发送文件
}
}