Изпращане на файл за трансфер на гнездо на Python

Python Socket File Transfer Send



Намерението на тази статия е да се научи как да прехвърлите текстов файл през мрежата чрез програма python . Това прехвърляне на файлове се основава на сървърния клиентски модел за използване на сокет програмиране в python3+.

Ето основната диаграма за настройка за изпълнение на тази програма.









За простота ще наричаме Система А като A_client и Система В като B_сървър през цялата статия.



Изисквания към файла:

Имаме нужда от server.py и този файл трябва да присъства в системата на сървъра. В нашия случай server.py трябва да е в системата B_server.





Още два файла client.py и sample.txt трябва да присъстват в клиентската система. В нашия случай тези два файла трябва да присъстват в системата A_client.

Предположения:

Ето предположенията:



  • Трябва да имаме две Linux системи с терминален достъп.
  • Предпочитан вкус на Linux е Ubuntu .
  • Python3 трябва да бъде инсталиран.
  • И двете Linux системи трябва да могат да се пингват помежду си. Използвайте пинг команда за проверка на ping.
  • Една система трябва да действа като сървър, а друга система да действа като клиент в определен момент.

Ограничения:

Преди да продължим по -нататък, трябва да знаем, че има някои ограничения на тази програма.

  • Python3+ трябва да бъде инсталиран, за да стартира тази програма. Може да забележите грешка или различно поведение, ако се изпълнява на по -стари версии на python.
  • Само текстови файлове могат да бъдат прехвърляни чрез тази програма към момента. Всеки друг формат, който не съдържа текст, може да се провали.
  • В програмата са обработени основни изключения от програмирането.
  • Програмата може или не може да работи на друга операционна система освен Ubuntu.
  • Текстовият файл трябва да е кратък от страна на клиента, тъй като е използван буфер с размер 1024 байта.

Задайте изисквания:

  • Нуждаем се от поне една Linux система, за да изпробваме тази програма. Но препоръката е да се използват две различни Linux системи, които са свързани чрез мрежа.
  • Две системи трябва да бъдат свързани чрез Ethernet или Wi-Fi или други връзки.

Изходен код на сървъра:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py

Изходен код на клиента:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py

Как да стартирате програми и очакван изход:

Ето стъпките за изпълнение на програмата.

Стъпка 1: Отидете в системата B_server и отворете терминал. Прекият път за отваряне на терминал е Alt+Ctrl+t.

Стъпка 2: Сега преминете по пътя, където присъства server.py.

Стъпка 3: Сега стартирайте server.py както по -долу

сървър python3.py

Не трябва да има грешки и трябва да видите отпечатъците по -долу

Сървърът се показва на порт: 9898

Името на копирания файл ще бъде recv.txt от страна на сървъра

Стъпка 4: Сега отворете терминала в системата A_client.

Стъпка 5: Отидете на пътя, където присъстват client.py и sample.txt.

Стъпка 6: Сега стартирайте client.py както по -долу

клиент на python3.py <B_сървърна IP система>

Забелязахме, че трябва да знаем IP адреса на сървъра. Можем да изпълним командата по -долу, за да знаем IP адреса на системата B_server.

ifconfig

Сега изходът на системата A_client трябва да бъде такъв

################### По -долу съобщението се получава от сървъра ##################
| -------------------------------- |
Здравей Клиент[IP адрес: 192.168.1.102],
** Добре дошли в сървъра **
-Сървър
| -------------------------------- |

Стъпка 7: Сега отидете на B_server и потърсете изхода по -долу

Файлът е копиран успешно
Сървърът прекъсна връзката

Стъпка 8: Трябва да има едно име на файл recv.txt в папката на сървъра. Съдържанието на този recv.txt трябва да бъде същото sample.txt.

Така че успешно копирахме файл от клиент на сървър през мрежа чрез програма python.

Обяснения на кода:

Има два файла на python server.py и client.py .

Имайте предвид, че ще обясним веднъж дали някой код е един и същ в server.py и client.py.

  1. server.py:
#!/usr/bin/env python3

Това е линия shebang, което означава, че по подразбиране този server.py трябва да използва python3. Нека видим едно предимство на тази линия.

Изпълнихме server.py или client.py като python3. Сега, без да използваме python3, можем да изпълним файла python. Следвайте командите по -долу

Отидете в суперпотребителски режим:

неговото

Дайте всички разрешения за .py файл:

chmod777сървър.py

Стартирайте server.py:

./ сървър.py внос гнездо
Импортиранегнездобиблиотека в програма на pythonкатоние отиваме
да използвамгнездо заВръзка.

с = гнездо.гнездо()

Ние създаваме обект с за достъп до всички методи на сокет. Това е концепция за ООП.

ПОРТ= 9898

Сега избираме един порт, където сървърът ще слуша. Можем да използваме незарегистриран порт вместо това.

с.обвързвам(('',ПОРТ))

Използваме метода на свързване, за да свържем ip адреса на сървъра с този порт [9898]. Едно наблюдение е, че можехме да използваме точен IP адрес на сървъра вместо първия аргумент на метода на свързване, но ние избираме да оставим празно, тъй като това работи добре.

с.обвързвам((IP адрес,ПОРТ))
файл = отворен('recv.txt', 'wb')

Отворихме едно име на файл recv.txt в сървъра за режим на запис и получихме указател на файл. Това се изисква, тъй като трябва да копираме един текстов файл от клиента.

докато Вярно:

Нека започнем един безкраен цикъл while, тъй като работата на сървъра е да изчака, докато клиентът комуникира със сървъра на този порт 9898. Така че този цикъл while е необходим.

съединител,addr=с.приемам()

Този код трябва да приема всяка входяща заявка за връзка от клиента. Conn ще използва съединител да комуникира с клиента и addr е IP адресът на клиент, който е изпратил заявка за безпокойство до този сървър на порт 9898.

съобщение= 'нн| -------------------------------- |нЗдравей клиент [IP адрес:
'
+ адр[0]+'],н** Добре дошли в сървъра **н-Сървърн
| -------------------------------- |н нн'

Този код е за създаване на съобщение за изпращане до клиента. Това съобщение трябва да бъде отпечатано на клиентския терминал. Това потвърждава, че клиентът може да комуникира със сървъра.

съединителизпращам(съобщениекодират())

Сега имаме готово съобщение и след това го изпращаме до клиента, използвайки това съединител Този код всъщност изпраща съобщение до клиента.

RecvData=съединителрец(1024)

Този код получава всички данни, изпратени от страна на клиента. В нашия случай очакваме съдържанието на sample.txt в RecvData .

докатоRecvData:

Още един цикъл while с условие RecvData не е празен. В нашия случай той не е празен.

файл.пиши(RecvData)

След като имаме съдържание вътре RecvData тогава пишем в този файл recv.txt използвайки указател на файл файл.

RecvData=съединителрец(1024)

Отново се опитвам да получа, ако има данни от клиента. Веднъж RecvData няма данни, кодът ще прекъсне цикъла while.

файл.близо()

Това просто ще затвори указателя на файла, тъй като приключихме с писането на файлове.

съединителблизо()

Това ще затвори връзката с клиента.

прекъсване

Това трябва да излезе от безкраен цикъл while на B_server.

  1. client.py:
внос sys

Импортиране на sys библиотека, както искаме, използвайте средство за аргументи в python.

ако (лен(sys.argv) > 1):
ServerIp= sys.argv[1]
иначе:
печат('ннБягай катонpython3 client.pyнн')
изход(1)

Докато предаваме IP адреса на B_server след името на файла client.py, докато работим, трябва да хванем този IP адрес на сървъра вътре в клиента.

… ..If (len (sys.argv)> 1): => За да се уверите, че потребителят предава поне един аргумент като IP адрес и улавя този IP адрес ServerIP.

Ако потребителят не предаде поне един код на аргумент, показва помощ и излиза от кода.

ПОРТ= 9898

Това трябва да е същия порт, както е споменато от страна на B_server.

с.свържете се((ServerIp,ПОРТ))

Този код ще направи TCP връзка към IP сървъра с този порт. Всичко, което не е наред в този пункт, води до неуспехи във връзката.

файл = отворен('sample.txt', 'rb')

Отваряме sample.txt в режим на четене, за да четем само съдържание.

SendData= файл.Прочети(1024)

Четене на съдържанието на файла и поставяне вътре SendData променлива.

докатоИзпращане на данни:

Започваме един цикъл while, ако SendData има данни. В нашия случай, ако sample.txt не е празен, той трябва да има данни.

с.изпращам(SendData)

Сега можем да изпращаме съдържание на sample.txt към сървъра, използвайки обект на гнездо с.

SendData= файл.Прочети(1024)

Отново четене, ако има нещо останало. Така че няма да има какво да се чете от файл SendData ще бъде празен и ще излезе от цикъла while.

с.близо()

Това не затваря връзката от страна на клиента.

Снимки на екрана на Ubuntu От страна на сървъра

Снимки на екрана на Ubuntu Клиентска страна

Изпитани комбинации:

  • Linux като сървър и Linux като клиент: PASS
  • Linux като клиент и Linux като сървър: PASS
  • Linux като сървър и Windows10 като клиент: PASS
  • Linux като клиент и Windows10 като сървър: PASS

Препоръката е да се използват две Linux системи за сървър и клиент.

Очаквани грешки:

  1. Можете да видите грешка по -долу, ако сървърът не работи на порт 9898

Проследяване (последно последно обаждане):

Файл'client.py',линия22, в <модул>
с.свържете се((ServerIp,ПОРТ))
ConnectionRefusedError:[Ерно111]връзката е отказана
  1. По -долу се вижда грешка, ако IP адресът не е предаден от страна на клиента

Бягай като

клиент на python3.py <servicerip адрес>
  1. По -долу грешката се вижда, ако 1уларгумент от страна на клиента не е IP адрес

Проследяване (последно последно обаждане):

Файл'client.py',линия22, в <модул>
с.свържете се((ServerIp,ПОРТ))
гнездо.gaierror:[Ерно -2]Имеилиобслужваненеизвестен
  1. По -долу се вижда грешка, ако портът се използва като 98980

Проследяване (последно последно обаждане):

Файл'client.py',линия22, в <модул>
с.свържете се((ServerIp,ПОРТ))
OverflowError: getsockaddrarg: портът трябва да бъде0-65535.
  1. По -долу се вижда грешка, ако sample.txt не присъства от страна на клиента.

Проследяване (последно последно обаждане):

Файл'client.py',линия25, в <модул>
файл = отворен('sample.txt', 'rb')
FileNotFoundError:[Ерно2]Няма таковафайл илидиректория:'sample.txt'

Заключение:

С помощта на тази програма можем да изпращаме обикновен текстов файл от една система в друга система чрез мрежа с помощта на програма python. Това ни дава основно изучаване на програмиране на python и сокети също за изпращане на данни през мрежа.