@janiya
Для организации копирования файлов с одного клиента на другой по сети на Golang можно использовать пакет net
, os
и io
.
Вот пример простого сервера, который принимает файлы и сохраняет их:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
package main import ( "fmt" "io" "log" "net" "os" ) func main() { // Создаем прослушиватель на порту 8080 listener, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal(err) } defer listener.Close() fmt.Println("Сервер запущен. Ожидание подключений...") for { // Принимаем входящее соединение conn, err := listener.Accept() if err != nil { log.Println(err) continue } defer conn.Close() // Принимаем имя файла и его размер fileName := make([]byte, 64) fileSize := make([]byte, 10) conn.Read(fileName) conn.Read(fileSize) // Конвертируем размер файла в int64 size, _ := strconv.ParseInt(strings.Trim(string(fileSize), ":"), 10, 64) // Создаем новый файл newFile, err := os.Create(strings.Trim(string(fileName), ":")) if err != nil { log.Fatal(err) } defer newFile.Close() // Копируем данные из сетевого соединения в файл var receivedBytes int64 for { if (size - receivedBytes) < BUFFERSIZE { io.CopyN(newFile, conn, (size - receivedBytes)) conn.Read(make([]byte, (receivedBytes+BUFFERSIZE)-size)) break } io.CopyN(newFile, conn, BUFFERSIZE) receivedBytes += BUFFERSIZE } fmt.Printf("Принят файл: %v ", fileName) } } |
В приведенном примере сервер ожидает подключения на порту 8080 и принимает файлы от клиентов. Он принимает имя файла и его размер, создает новый файл на сервере и постепенно копирует данные из сетевого соединения в этот файл.
Следующий пример демонстрирует, как отправлять файлы на сервер:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
package main import ( "fmt" "log" "net" "os" ) func main() { // Считываем путь к файлу, который нужно отправить fmt.Print("Введите путь к файлу: ") var filePath string fmt.Scanln(&filePath) // Открываем файл для чтения file, err := os.Open(filePath) if err != nil { log.Fatal(err) } defer file.Close() // Получаем файловую информацию fileInfo, err := file.Stat() if err != nil { log.Fatal(err) } // Создаем TCP-соединение с сервером conn, err := net.Dial("tcp", "localhost:8080") if err != nil { log.Fatal(err) } defer conn.Close() // Отправляем имя файла и его размер серверу fileName := fileInfo.Name() fileSize := fillString(strconv.FormatInt(fileInfo.Size(), 10), 10) conn.Write([]byte(fileName)) conn.Write([]byte(fileSize)) // Копируем содержимое файла в сетевое соединение sendBuffer := make([]byte, BUFFERSIZE) for { _, err = file.Read(sendBuffer) if err == io.EOF { break } conn.Write(sendBuffer) } fmt.Println("Файл успешно отправлен на сервер.") } func fillString(returnString string, toLength int) string { for { lengthString := len(returnString) if lengthString < toLength { returnString = ":" + returnString continue } break } return returnString } |
В этом примере клиент считывает путь к файлу, который нужно отправить на сервер, и открывает этот файл для чтения. Затем он устанавливает TCP-соединение с сервером и отправляет имя файла и его размер. После этого он читает содержимое файла и отправляет его на сервер.
Обратите внимание, что в приведенных примерах использована переменная BUFFERSIZE
. Это размер буфера для передачи данных по сети и можно настроить его по вашему усмотрению.
Надеюсь, это поможет вам организовать копирование файлов с одного клиента на другой по сети на Golang.