先写客户端代码
func main() { fmt.Println("请输入需要传输的文件路径") var path string fmt.Scan(&path) //获取文件名 info, err := os.Stat(path) if err != nil { fmt.Println("err = ", err) return } //连接服务器 conn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("err = ", err) return } defer conn.Close() //给服务器发送文件名 _, err = conn.Write([]byte(info.Name())) if err != nil { fmt.Println("err = ", err) return } //接收服务器回复 bytes := make([]byte, 1024) num, err := conn.Read(bytes) if err != nil { fmt.Println("err = ", err) return } if string(bytes[:num]) == "ok" { //发送文件内容 sendFile(path, conn) } } func sendFile(path string, conn net.Conn) { file, err := os.Open(path) if err != nil { fmt.Println("err = ", err) return } defer file.Close() //读取文件内容 arr := make([]byte, 1024) for { num, err := file.Read(arr) conn.Write(arr[:num]) if err == io.EOF { break } if err != nil { fmt.Println("err = ", err) return } } }
然后是服务器代码
func main() { listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("err = ", err) return } defer listener.Close() //阻塞等待用户连接 conn, err := listener.Accept() if err != nil { fmt.Println("err = ", err) return } defer conn.Close() //读取文件名 bytes := make([]byte, 1024) num, err := conn.Read(bytes) if err != nil { fmt.Println("err = ", err) return } fileName := string(bytes[:num]) //回复"ok" conn.Write([]byte("ok")) //接收文件内容 receiveFile(fileName, conn) } func receiveFile(path string, conn net.Conn) { file, err := os.Create(path) if err != nil { fmt.Println("err = ", err) return } bytes := make([]byte, 1024) for { num, err := conn.Read(bytes) file.Write(bytes[:num]) if err == io.EOF { break } if err != nil { fmt.Println("err = ", err) return } } }