Python

Python Socket File Transfer Transfer Изпращане

Python Socket File Transfer Transfer Изпращане
Целта на тази статия е да се научи как да прехвърля текстов файл през мрежата чрез програма python. Този трансфер на файлове се основава на клиентски модел на сървър, за да се използва сокет програмиране в python3+.

Основна диаграма за настройка:

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

За простота ще наричаме система A като A_client и система B като B_server в цялата статия.

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

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

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

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

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

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

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

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

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

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: Сега отидете по пътя, където сървър.py присъства.

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

python3 сървър.py

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

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

Копираното име на файл ще бъде възстановено.txt от страна на сървъра

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

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

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

клиент на python3.py

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

ifconfig

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

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

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

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

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

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

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

Има два python файла сървър.py и клиент.py.

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

  1. сървър.py:
#!/ usr / bin / env python3

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

Изпълнихме сървъра.py или клиент.py харесвам python3 <.py file name>. Сега, без да използваме python3, можем да изпълним файла python. Следвайте командите по-долу

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

су

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

chmod 777 сървър.py

Стартирайте сървър.py:

./ сървър.py сокет за импортиране
Импортиране на библиотека на сокети в програмата на python, както вървим
за да използвате гнездо за връзка.
s = гнездо.гнездо ()

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

ПОРТ = 9898

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

с.bind ((", PORT))

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

с.bind ((IP адрес, PORT))
файл = отворен ("рев.txt "," wb ")

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

докато е вярно:

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

conn, addr = s.приемете ()

Този код е за приемане на всяка входяща заявка за връзка от клиента. Кон ще използва „кон да комуникира с клиент и „Адрес“ е IP адресът на клиент, изпратил заявка за суматоха до този сървър на порт 9898.

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

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

конн.изпращане (съобщ.encode ())

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

RecvData = свързване.рекв. (1024)

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

докато RecvData:

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

файл.запис (RecvData)

След като имаме съдържание вътре “RecvData” тогава пишем в този файл „Препоръч.текст" с помощта на указател на файл „Файл“.

RecvData = свързване.рекв. (1024)

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

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

Това просто ще затвори показалеца на файла, когато приключим с писането на файл.

конн.близо()

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

почивка

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

  1. клиент.py:
импортиране на sys

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

if (len (sys.argv)> 1):
ServerIp = sys.argv [1]
друго:
print ("\ n \ n Стартирайте като \ n python3 клиент.py < serverip address > \ n \ n ")
изход (1)

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

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

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

ПОРТ = 9898

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

с.свързване ((ServerIp, PORT))

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

файл = отворен ("пример.txt "," rb ")

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

SendData = файл.четене (1024)

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

докато SendData:

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

с.изпрати (SendData)

Сега можем да изпращаме съдържание на „Проба.текст" към сървър, използващ сокет обект "с".

SendData = файл.четене (1024)

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

с.близо()

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

Ubuntu Screenshots Сървърна страна

Ubuntu Screenshots Клиентска страна

Тествани комбинации:

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

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

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

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

Traceback (последно последно обаждане):

Файл "клиент.py ", ред 22, в
с.свързване ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Връзката е отказана
  1. По-долу се вижда грешка, ако IP адресът не е предаден от страна на клиента

Тичай като

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

Traceback (последно последно обаждане):

Файл "клиент.py ", ред 22, в
с.свързване ((ServerIp, PORT))
гнездо.gaierror: [Errno -2] Име или услуга не са известни
  1. По-долу се вижда грешка, ако портът се използва като 98980

Traceback (последно последно обаждане):

Файл "клиент.py ", ред 22, в
с.свързване ((ServerIp, PORT))
OverflowError: getsockaddrarg: портът трябва да е 0-65535.
  1. По-долу се вижда грешка, ако „проба.txt ”не присъства от страна на клиента.

Traceback (последно последно обаждане):

Файл "клиент.py ", ред 25, в
файл = отворен ("пример.txt "," rb ")
FileNotFoundError: [Errno 2] Няма такъв файл или директория: 'sample.текст'

Заключение:

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

Най-добрите игри за команден ред за Linux
Командният ред не е само най-големият ви съюзник при използване на Linux - той може да бъде и източник на забавление, защото можете да го използвате, ...
Най-добрите приложения за картографиране на геймпад за Linux
Ако искате да играете игри на Linux с геймпад вместо типична система за въвеждане на клавиатура и мишка, има някои полезни приложения за вас. Много ко...
Полезни инструменти за геймърите на Linux
Ако искате да играете игри на Linux, има вероятност да сте използвали приложения и помощни програми като Wine, Lutris и OBS Studio, за да подобрите иг...