Python

Надіслати передачу файлів із сокетом Python

Надіслати передачу файлів із сокетом Python
Мета цієї статті - навчитися як перенести текстовий файл через мережу через програму python. Ця передача файлів базується на клієнтській моделі сервера, щоб використовувати програмування сокетів у python3+.

Основна схема налаштування:

Ось основна схема налаштування для запуску цієї програми.

Для простоти ми будемо називати систему A як A_client, а систему B як B_server у всій статті.

Вимоги до файлу:

Нам потрібно сервер.py і цей файл повинен бути присутнім у серверній системі. У нашому випадку сервер.py має бути в системі B_server.

Ще два файли клієнт.py і зразок.txt повинні бути присутніми в клієнтській системі. У нашому випадку ці два файли повинні бути присутніми в системі 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 має бути таким самим зразком.txt.

Отже, ми успішно скопіювали файл із клієнта на сервер через мережу за допомогою програми python.

Пояснення коду:

Є два файли python сервер.py і клієнт.py.

Зверніть увагу, що ми один раз пояснимо, чи є який-небудь код однаковим всередині сервера.py та клієнт.py.

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

Це рядок shebang, що за замовчуванням означає цей сервер.py повинен використовувати python3. Побачимо одну перевагу цієї лінії.

Ми виконали сервер.py або клієнт.py подобається python3 <.py file name>. Тепер без використання python3 ми можемо виконати файл python. Виконайте наведені нижче команди

Перейти в режим суперкористувача:

su

Дайте всі дозволи .файл py:

сервер chmod 777.py

Запустити сервер.py:

./ сервер.py сокет імпорту
Імпортуємо бібліотеку сокетів у програму python
використовувати гніздо для підключення.
s = розетка.сокет ()

Ми створюємо об’єкт “S” отримати доступ до всіх методів сокета. Це концепція ООП.

ПОРТ = 9898

Тепер ми обираємо один порт, де буде прослуховуватися сервер. Замість цього ми можемо використовувати незарезервований порт.

s.bind ((", PORT))

Ми використовуємо метод прив'язки для прив'язки IP-адреси сервера до цього порту [9898]. Одне зауваження полягає в тому, що ми могли використовувати точну IP-адресу сервера замість першого аргументу методу прив'язки, але ми вирішили залишити порожнім, оскільки це працює нормально.

s.bind ((IP-адреса, PORT))
файл = відкритий ("рекв.txt "," wb ")

Ми відкрили одне ім'я файлу “recv.txt ”на сервері для режиму запису та отриманого вказівника на файл. Це потрібно, оскільки нам потрібно скопіювати один текстовий файл із клієнта.

Правда:

Почнемо один нескінченний цикл while, оскільки завдання сервера - дочекатися, поки клієнт зв’яжеться із сервером на цьому порту 9898. Отже, потрібен цикл while.

conn, addr = s.прийняти ()

Цей код приймає будь-який запит на вхідне з'єднання від клієнта. Конн використовуватиме “зв’язок ” спілкуватися з клієнтом і “Addr” - це 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” тоді ми пишемо до цього файлу “Відкр.txt " за допомогою вказівника на файл “Файл”.

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-адресу в insdie “ServerIP”.

Якщо користувач не передає хоча б один аргумент, код показує довідку та виходить із коду.

ПОРТ = 9898

Це повинен бути той самий порт, як зазначено на стороні B_server.

s.підключитися ((ServerIp, PORT))

Цей код буде здійснювати TCP-з'єднання з IP-сервером за допомогою цього порту. Що-небудь неправильне в цьому понті призводить до невдач у зв'язку.

file = open ("зразок.txt "," rb ")

Ми відкриваємо “зразок.txt ”у режимі читання для читання лише вмісту.

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

Читання вмісту файлу та введення всередину “SendData ” змінна.

в той час як SendData:

Ми починаємо цикл one while, якщо “SendData ” має дані. У нашому випадку якщо “зразок.txt ”не порожній, він повинен мати дані.

s.надіслати (SendData)

Тепер ми можемо надіслати вміст “Зразок.txt " на сервер за допомогою об'єкта socket “S”.

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

Знову читаю, якщо щось залишилось. Тож читати з файлу буде нічого “SendData” буде порожнім, і він вийде з циклу while.

s.закрити ()

Це не закриває з'єднання з боку клієнта.

Скріншоти Ubuntu на стороні сервера

Знімки екрану Ubuntu на стороні клієнта

Випробувані комбінації:

  • Linux як сервер і Linux як клієнт: PASS
  • Linux як клієнт і Linux як сервер: PASS
  • Linux як сервер і Windows10 як клієнт: PASS
  • Linux як клієнт і Windows10 як сервер: PASS

Рекомендація полягає у використанні двох систем Linux для сервера та клієнта.

Очікувані помилки:

  1. Ви можете побачити нижче помилку, якщо сервер не працює на порту 9898

Відстеження (останній останній дзвінок):

Файл "клієнт.py ", рядок 22, в
s.підключитися ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Підключення відмовлено
  1. Нижче видно помилку, якщо IP-адреса не передається на стороні клієнта

Бігай як

клієнт python3.py < serverip address >
  1. Нижче видно помилку, якщо 1вул аргумент на стороні клієнта - це не IP-адреса

Відстеження (останній останній дзвінок):

Файл "клієнт.py ", рядок 22, в
s.підключитися ((ServerIp, PORT))
розетка.gaierror: [Errno -2] Ім'я чи послуга невідомі
  1. Нижче видно помилку, якщо порт використовується як 98980

Відстеження (останній останній дзвінок):

Файл "клієнт.py ", рядок 22, в
s.підключитися ((ServerIp, PORT))
OverflowError: getsockaddrarg: порт повинен бути 0-65535.
  1. Нижче видно помилку, якщо “зразок.txt ”відсутній на стороні клієнта.

Відстеження (останній останній дзвінок):

Файл "клієнт.py ", рядок 25, в
file = open ("зразок.txt "," rb ")
FileNotFoundError: [Errno 2] Немає такого файлу або каталогу: 'зразок.txt '

Висновок:

За допомогою цієї програми ми можемо надсилати простий текстовий файл з однієї системи в іншу через мережу за допомогою програми python. Це дає нам базове навчання програмуванню на python і socket, а також для передачі даних через мережу.

How to change Left & Right mouse buttons on Windows 10 PC
It's quite a norm that all computer mouse devices are ergonomically designed for right-handed users. But there are mouse devices available which are s...
Emulate Mouse clicks by hovering using Clickless Mouse in Windows 10
Using a mouse or keyboard in the wrong posture of excessive usage can result in a lot of health issues, including strain, carpal tunnel syndrome, and ...
Add Mouse gestures to Windows 10 using these free tools
In recent years computers and operating systems have greatly evolved. There was a time when users had to use commands to navigate through file manager...