发送方
package main import ( "fmt" "os" "net" "io" ) //发送文件内容 func SendFile(path string, conn net.Conn) { //以只读方式打开文件 f, err := os.Open(path) if err != nil { fmt.Println("open file err = ", err) return } defer f.Close() //核心功能,读多少就发送多少 buf := make([]byte, 2048) for true { n , err := f.Read(buf) if err != nil { if err == io.EOF { fmt.Println("文件发送完毕") return }else { fmt.Println("f.read err = ", err) return } } //给服务器发送内容 conn.Write(buf[:n]) } } func main() { //提示输入文件 fmt.Println("请输入需要传输的文件:") var path string fmt.Scan(&path) //获取文件名 info, err := os.Stat(path) if err != nil { fmt.Print("获取文件名err = ", err) return } //文件连接服务器 conn, err1 := net.Dial("tcp", ":8000") if err1 != nil { fmt.Println("net.Dial err = ", err1) return } defer conn.Close() //给接收方发送文件名 _, err = conn.Write([]byte(info.Name())) if err != nil { fmt.Println("conn.Write err = ", err) return } buf := make([]byte, 1024) n, err := conn.Read([]byte(buf)) if err != nil { fmt.Println("conn.Read err = ", err) } if "ok" == string(buf[:n]) { fmt.Println("开始发送文件了") //发送文件 SendFile(path, conn) } }
接收方
package main import ( "net" "fmt" "os" "io" ) //接收文件内容 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, 4*1024) for true { n, err := conn.Read(buf) //接收对方发过来的文件内容 if err != nil { if err == io.EOF { fmt.Println("文件接收完毕") }else { fmt.Println("f.read err = ", err) return } } f.Write(buf[:n]) } } func main() { //监听 listener, err := net.Listen("tcp", ":8000") if err != nil { fmt.Println("net.Listen err = ", err) return } defer listener.Close() conn, err := listener.Accept() if err != nil { fmt.Println("listener.Accept err = ", err) return } //读取文件名 buf := make([]byte, 1024) var n int n, err = conn.Read(buf) if err != nil { fmt.Println("conn read err = " ,err) return } fileName :=string(buf[:n]) //回复OK conn.Write([]byte("ok")) //接收文件内容 RecvFile(fileName, conn) }
先开始发送方的服务后再开始接收方,在发送方输入发送的文件名