이 글은 주로 Golang의 파일 전송 기능을 자세하게 소개하고 있습니다. 글에 있는 샘플 코드가 아주 자세하게 소개되어 있고 관심 있는 친구들이 참고할 수 있습니다 |
이 글의 예시는 참고를 위해 Golang의 파일 전송을 위한 구체적인 코드를 공유합니다. 구체적인 내용은 다음과 같습니다.
TCP를 사용하여 파일 전송을 완료하는 방법은 다음과 같습니다.
1. 서버 파일 이름에 서버는 파일 이름을 저장합니다.
2. 수신자(서버)는 파일 이름이 성공적으로 저장되었음을 확인하기 위해 클라이언트에게 ok 메시지를 반환합니다.
3. 메시지를 받은 후 보낸 사람(클라이언트)은 파일 데이터를 서버로 보내기 시작합니다.
4. 수신자(서버)는 파일 내용을 읽고 이전에 저장된 파일에 씁니다.
먼저 파일 이름을 알아보세요. 파일 속성 정보를 얻으려면 os 패키지의 stat() 함수를 사용하십시오. 함수에서 반환된 파일 속성에 파일 이름과 파일 크기를 포함합니다. Stat 매개변수 이름은 파일 액세스의 절대 경로로 전달됩니다. FileInfo의 Name() 함수를 사용하면 파일 이름을 별도로 추출할 수 있습니다.
func Stat(name string) (FileInfo, error) type FileInfo interface { Name() string Size() int64 Mode() FileMode ModTime() time.Time IsDir() bool Sys() interface{} }
Sender:
package main import ( "fmt" "io" "net" "os" ) 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, 1024) for { n, err := f.Read(buf) if err != nil { if err == io.EOF { fmt.Println("发送文件完成。") } else { fmt.Println("os.Open err:", err) } return } // 写到网络socket中 _, err = conn.Write(buf[:n]) if err != nil { fmt.Println("conn.Write err:", err) return } } } func main() { list := os.Args // 获取命令行参数 if len(list) != 2 { fmt.Println("格式为:go run xxx.go 文件绝对路径") return } // 提取 文件的绝对路径 filePath := list[1] //提取文件名 fileInfo, err := os.Stat(filePath) if err != nil { fmt.Println("os.Stat err:", err) return } fileName := fileInfo.Name() // 主动发起连接请求 conn, err := net.Dial("tcp", "127.0.0.1:8000") 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, 1024) n, err := conn.Read(buf) if err != nil { fmt.Println("conn.Read err:", err) return } if "ok" == string(buf[:n]) { // 写文件内容给服务器——借助conn sendFile(conn, filePath) } }
Receiver:
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, 1024) for { n, _ := conn.Read(buf) if n == 0 { fmt.Println("接收文件完成。") return } // 写入本地文件,读多少,写多少。 f.Write(buf[:n]) } } func main() { // 创建用于监听的socket listener, err := net.Listen("tcp", "127.0.0.1:8000") 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, 1024) 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(conn, fileName) }
위 내용은 이 글의 전체 내용이므로, 모든 분들의 공부에 도움이 되길 바랍니다.
추천 학습: "go 비디오 튜토리얼"
위 내용은 Golang에서 파일 전송 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!