获取文件信息需要用到os. stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息ok,才读取本地文件 发送给接收者。
发送者:
package mainimport ( fmt io net os)func main() { fmt.println(请输入接收者地址(ip:port):) var addr string fmt.scan(&addr) fmt.println(请输入需要传输的文件:) var path string fmt.scan(&path) info, errf := os.stat(path) if errf != nil{ fmt.println(os.stat errf =, errf) return } conn, err := net.dial(tcp, addr) if err != nil{ fmt.println(net.dial err =,err) return } defer conn.close() _, err = conn.write([]byte(info.name())) if err != nil{ fmt.println(conn.write info.name err =,err) return } var n int buf := make([]byte, 1024) n, err = conn.read(buf) if err != nil{ fmt.println(conn.read ok err =, err) return } if ok == string(buf[:n]){ fmt.println(ok) sendfile(path, conn) }}func sendfile(path string, conn net.conn){ file , err := os.open(path) if err != nil{ fmt.println(os.open err =, err) return } defer file.close() buf := make([]byte, 1024 * 4) for { n, err := file.read(buf) if err != nil{ if err == io.eof{ fmt.println(文件发送完毕) } else{ fmt.println(file.read err =,err) } return } if n == 0{ fmt.println(文件发送完毕) break } conn.write(buf[:n]) }}
接收者:
package mainimport ( fmt io net os)func main() { fmt.println(请你的地址(ip:port):) var addr string fmt.scan(&addr) listenner, err := net.listen(tcp, addr) if err != nil{ fmt.println(net.listen err =, err) return } defer listenner.close() conn, errl := listenner.accept() if errl != nil{ fmt.println(listenner.accept err =, errl) return } var n int buf := make([]byte, 1024) n, err = conn.read(buf) if err != nil{ fmt.println(conn.read filename err =, err) return } filename := string(buf[:n]) n, err = conn.write([]byte(ok)) if err != nil{ fmt.println(conn.write ok err =, err) return } recvfile(filename, conn)}func recvfile(filename string, conn net.conn){ file , err := os.create(filename) if err != nil{ fmt.println(os.create err =, err) return } defer file.close() buf := make([]byte, 1024 * 4) for{ n, err := conn.read(buf) if err != nil{ if err == io.eof{ fmt.println(文件接收完成) } else { fmt.println(conn.read err =, err) } return } n, err = file.write(buf[:n]) if err != nil{ fmt.println(file.write err =, err) break } }}
以上就是分享golang实现文件传输小demo的详细内容。
