Програмування розетки Python - Перш ніж почати програмування Python Socket, сподіваюся, у вас є хороші основи в python. Якщо ви також знаєте Джанго, то зрозуміти це було б ще простіше. Ні, програмування сокетів не пов’язане з Django, але термінології в програмуванні сокетів Python і Django майже однакові, хоча це дві різні категорії. Отже, для початку, що саме таке програмування Python Socket? Програмування Python Socket існує не тільки в python, але й у Java та майже у всіх інших мовах програмування. Але у випадку з python програмування socket насправді зрозуміти дуже просто. Програмування Python Socket означає мережеве програмування. Він включає коди клієнта та пов'язані з сервером Python Socket сервери. Але це визначення настільки ж добре, як книга, в якій говориться про програмування С, використовується для розробки програмного забезпечення. І ні, я не для цього. Я тут, щоб переконатися, що ви глибше розумієте основи програмування розеток Python, перш ніж ви дійсно починаєте писати власні модулі сокетів. Тож давайте почнемо працювати і подивитися, як працює сокет або на стороні клієнта, або на стороні сервера Python Socket.

Що таке програмування Python Socket?

Якщо ви навчилися програмуванню на C, то вивчити програмування розетки python у Python було б дуже просто, оскільки вони майже однакові. Щоб зробити його більш простим, програмування розетки python - це лише частина коду щодо того, як комп'ютери в мережі спілкуються один з одним. І це не закінчується лише мережею на базі локальної мережі, вона також підтримує мережі WAN, MAN та інтранет. Ми навіть використовуємо розетки в нашому повсякденному житті. Не розумію? Дозвольте навести простий приклад. Коли ви хочете підключитися до, скажімо, Facebook.com, ви просто введіть те саме в URL-рядку. Отже, це з'єднання, яке ви тільки що створили, не просто створене за допомогою DNS-матеріалів. Це все налаштовано за допомогою програмування розетки python. Розетки вирішують, як спілкуються дві мережі. Будь-яке спілкування, що проходить через мережу, може це відео, VOIP-з'єднання або просто текст; все проходить через розетку. Тепер, коли ми знаємо, що таке сокети, давайте розвивати власний сокет у python.

Джерело зображення: pixabay.com

Типи програмування розеток Python

Зараз там є безліч розеток. Але ми не будемо говорити про всіх них, оскільки я не можу тут охопити кожного. Ви можете створити UDP-сокет, TCP-сокет або навіть порт-розетку, і якщо я продовжую, є ще багато. Але я хотів би сьогодні більше розглянути сокети TCP та UDP, оскільки вони є найбільш основними, і вони можуть бути надзвичайно гарними як початківця, щоб почати програмування Python Socket.

  • Програмування розеток UDP

User Datagram Protocol або його загальновідомий як UDP - це альтернативний протокол до TCP, який передає пакети з одного хоста на інший. Але на відміну від TCP (протокол управління передачею), UDP є протоколом без підключення і орієнтований на потоки. Це означає, що сервер UDP буде захоплювати тільки вхідні пакети з усіх хостів, не ідентифікуючи надійне джерело з'єднання. Для цього ми використаємо функцію socket.socket. Простий сокет UDP створюється таким чином у Python:

імпортувати socket #імпортувати модуль сокета з бібліотеки python # Тепер нам потрібно створити AF_INET і sock dgram socketss = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) надрукувати "Сокетування успішного створення"

Так. Це все, і ми створили просту розетку UDP тут, у python. Програмування Python Socket або навіть створення простого сокета - це не ракетна наука. Але велика справа полягає в кодуванні UDP-сервера та клієнта. Оскільки UDP-розетки не пов'язані, комутатори ініціюються функціями розсилання та прийому. Ці функції не вимагають їх з'єднання один з одним. Вони можуть фактично надсилати та отримувати пакети з будь-якого випадкового джерела. Ось як створюється сервер UDP:

імпортувати socketport = 2924s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) s.bind (("", port)) друкувати "Запит на підключення до порту на машині", порт

поки 1:

дані, адреса = s.recvfrom (1024)

друкувати дані

Це може здатися мало, але саме так воно і створюється насправді. Тут можна використовувати будь-який порт. Щойно я вибрав випадковий номер 2924. Серверу UDP потрібен порт для відкриття та надсилання вхідних з'єднань. Немає прослуховування порту або прийняття з'єднань чи запитів. Це просто відбувається без будь-якої автентифікації. Спробуйте запустити вищевказаний сервер на терміналі і подивіться, як він працює.

Це просто простий сервер UDP, який ми створили. Давайте зробимо це трохи цікавіше, а також трохи складніше:

"" Це простий сервер сокетів UDP "" імпортувати socketimport sys

HOST = “” # Тут можна спробувати всі доступні інтерфейси

PORT = 2924 # Будь-який випадковий порт, який не використовується за замовчуванням у вікнах Windows або Linux

# Кодування UDP-сокета

спробуйте:

s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)

друкувати "Сокет ініціалізований" "

крім socket.error, msg:

print "Не вдалося створити розетку. Виникла помилка: "+ str (msg (0)) +" message "+ msg (1)

sys.exit ()

# Тепер нам потрібно прив’язати цей сокет до вищевказаного хоста і порту

спробуйте:

s.bind ((HOST, PORT))

крім socket.error, msg:

надрукувати “Помилка з'єднання не вдалася. Наступна помилка перервала прив'язку: "+ str (msg (0)) +" Message "+ msg (1)

sys.exit ()

друкувати "Приєднання розетки завершено"

# Підтримуйте встановлене з'єднання

поки 1:

# захоплення даних від клієнта за допомогою змінних даних та адреси

d = s.recvвід (1024)

дані = d (0)

адреса = d (1)

якщо не дані:

перерву

відповідь = "Добре …" + дані

s.sendto (відповідь, адреса)

print "Токенове повідомлення (" + адреса (0) + ": '+ str (адреса (1)) +') - '+ data.strip ()

s.close ()

Запустіть вищезгадану програму, і ви запустите сервер UDP на порту 2924. З повагою, ви успішно створили Socket в Python. І обов'язково зауважте, що сервер UDP може обробляти навантаження клієнтів на відміну від TCP-сервера, головна причина - відсутність фіксованого підключення на сервері UDP, як у випадку з сервером TCP.

Рекомендовані курси

  • Курс сертифікації в налагодженні Ruby
  • Курс PHP MySQL
  • Курс сертифікації програмування VB.NET
  • Пройти повний тренінг фонду ITIL
  • Програмування клієнтів UDP

Тепер, коли ми успішно створили сервер UDP, нам потрібен клієнт, щоб встановити належне підключення до нього, щоб ми знали його роботу. Тож давайте працюємо над створенням належного клієнта UDP в Python. Цей клієнт підключиться до нашого UDP-сервера, який ми створили вище:

"" Створення простого UDP-клієнта usind socks "" імпортувати socketimport sys

# Створення UDP-сокета

спробуйте:

s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)

крім socket.error:

print "Не вдалося створити сокет"

sys.exit ()

хост = '127.0.0.1'; # Ви також можете спробувати скористатися localhost insad цього IP, обидва однакові.

порт = 2924;

поки (1):

msg = raw_input ('Введіть повідомлення для надсилання на сервер:')

спробуйте:

# Тепер нам потрібно встановити рядки

s.sendto (msg, (хост, порт))

# Тепер нам потрібно отримати дані та адресу від клієнта, використовуючи дані та адресу

d = s.recvвід (1024)

відповідь = d (0)

адреса = d (1)

print "Відповідь із сервера:" + відповідь

крім socket.error, msg:

print 'Після появи помилки:' + str (msg (0)) + 'Message' + msg (1)

sys.exit ()

Так. Створення UDP-клієнта в програмуванні Python Socket набагато простіше, ніж створення UDP-сервера. Але так воно і йде. Я не думаю, що мені потрібно було би щось пояснювати з наведеного фрагменту коду, оскільки я вже згадував усі необхідні речі в коментарях # тегів. Просто переконайтеся, що IP-адреса та порт, який ви ввели, є належними, а ваш брандмауер не блокує з'єднання, інакше це завжди призведе до відмови, незалежно від того.

  • Програмування розеток TCP

Тепер, коли ми дізналися, як створити клієнт UDP та сервер, давайте подивимось на програмування TCP-розеток. Ми будемо використовувати ту ж функцію socket.socket, щоб створити тут сокет TCP.

імпорт сокета # Імпорт сокетного модуля з бібліотек python # створіть AF_INET і потік socketss = socket.socket (socket.AF_INET, socket.SOCK_STREAM) надрукувати друк "Сокетування успішного створення"

Тут AF_INET використовується для підключення адреси Ipv4, а потік носка - протокол, орієнтований на TCP. Це простий сокет TCP, який ми створили. Тепер ми будемо створювати вдосконалену версію того ж самого. Ми також будемо викидати тут винятки, так само, як ми кидали це під час створення серверів та клієнтів UDP, так що у випадку, якщо з'єднання не вдасться, ми дізнаємось, де лежить фактична програма. Socket.error буде використовуватися для обробки всіх цих помилок, аналогічних помилкам програмування UDP.

Тож тепер давайте зможемо створити розетку із зазначеними вище помилками та підключитися до хоста facebook.com. Ось як це потрібно зробити:

імпорт сокета # імпорт модуля сокетаімпорт systry: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

крім socket.error, msg:

print 'Не вдалося створити сокет. Виникла наступна помилка: '+ str (msg (0)) +', повідомлення про помилку: '+ msg (1)

sys.exit ();

надрукувати "Розробка сокета успішно"

host = 'www.facebook.com'

порт = 2924

спробуйте:

remote_ip = socket.gethostbyname (хост)

крім socket.gaierror:

print 'Неправильне ім'я хоста. Вихід… '

sys.exit ()

print "+ хост + IP-адреса" - "+ remote_ip

s.connect ((remote_ip, port))

надрукувати "Socket Connected to" + host + "on ip" + remote_ip

Зараз цього достатньо, якщо нам потрібно просто налагодити зв’язок. Але це не наша мета. Ми маємо намір створити з'єднання, де ми могли б надсилати та отримувати дані також на обох кінцях. Ми можемо надсилати дані за допомогою функції sendall. Тож ось як це йде:

імпорт сокета # імпорт модуля сокетаімпорт systry: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

крім socket.error, msg:

print 'Не вдалося створити сокет. Виникла наступна помилка: '+ str (msg (0)) +', повідомлення про помилку: '+ msg (1)

sys.exit ();

надрукувати "Розробка сокета успішно"

host = 'www.facebook.com'

порт = 2924

спробуйте:

remote_ip = socket.gethostbyname (хост)

крім socket.gaierror:

print 'Неправильне ім'я хоста. Вихід… '

sys.exit ()

print "+ хост + IP-адреса" - "+ remote_ip

s.connect ((remote_ip, port))

надрукувати "Socket Connected to" + host + "on ip" + remote_ip

# перенесення даних за допомогою функції sendall

message = "GET / HTTP / 1.1 \ r \ n \ r \ n"

спробуйте:

s.sendall (повідомлення)

крім socket.error:

Помилка надсилання #

друкувати "Збій передачі"

sys.exit ()

print "Статус повідомлення: Надіслано"

Тепер, коли ми створили успішне з'єднання і ми також можемо надсилати дані, давайте подивимось, як ми могли взагалі отримати дані. Це так:

імпорт сокета # імпорт модуля сокетаімпорт systry: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

крім socket.error, msg:

print 'Не вдалося створити сокет. Виникла наступна помилка: '+ str (msg (0)) +', повідомлення про помилку: '+ msg (1)

sys.exit ();

надрукувати "Розробка сокета успішно"

host = 'www.facebook.com'

порт = 2924

спробуйте:

remote_ip = socket.gethostbyname (хост)

крім socket.gaierror:

print 'Неправильне ім'я хоста. Вихід… '

sys.exit ()

print "+ хост + IP-адреса" - "+ remote_ip

s.connect ((remote_ip, port))

надрукувати "Socket Connected to" + host + "on ip" + remote_ip

# перенесення даних за допомогою функції sendall

message = "GET / HTTP / 1.1 \ r \ n \ r \ n"

спробуйте:

s.sendall (повідомлення)

крім socket.error:

Помилка надсилання #

друкувати "Збій передачі"

sys.exit ()

print "Статус повідомлення: Надіслано"

# Тепер для отримання даних ми використовуємо функцію recv для її досягнення

відповідь = s.recv (4096)

друкувати відповідь

Остаточне, що нам потрібно закрити сокет, який ми могли б зробити це наступним кодом:

s.close ()

І нарешті, обов'язкова частина. Ми можемо використовувати функцію bind, щоб зв'язати сокети з ip-адресами та портами.

імпортувати socketimport sysHOST = ”# Це те саме, що ми зробили в протоколі UDPPORT = 2924 # порт для доступу до даних.

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

надрукувати "Успіх створення сокета"

спробуйте:

s.bind ((HOST, PORT))

крім socket.error, msg:

print 'Прив’язка не вдалася. Після помилки, що сталася '+ str (msg (0)) +' Message '+ msg (1)

sys.exit ()

надрукувати "Сокетне прив’язка успішна"

Тепер нам потрібно слухати вхідні для вхідних з'єднань, якщо нам потрібен сервер для підключення. Це можна зробити за допомогою такої простої команди:

s.listen (10) надрукувати "Слухач розпочато"

І нарешті, нам потрібно створити розетку, щоб прийняти ці з'єднання:

імпортувати socketimport sysHOST = ”PORT = 2924

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

надрукувати "Розробка сокета успішно"

спробуйте:

s.bind ((HOST, PORT))

крім socket.error, msg:

print 'Прив’язка не вдалася. Наступна помилка сталася '+ str (msg (0)) +' Message '+ msg (1)

sys.exit ()

надрукувати "Встановлення розетки успішно"

підкладка (10)

print "Слухач розпочато"

# Прийняття з'єднань

conn, addr = s.accept ()

# Надання інформації про підключеного клієнта

print "З'єднання встановлено за допомогою" + addr (0) + ": '+ str (addr (1))

Насправді це набагато більше. Ми також можемо писати коди для обробників та інших матеріалів. Але я думаю, це було б наразі. Переконайтеся, що ці основи ви правильні, після чого решта деталей - це лише шматок пирога, який слід вивчити.

Перше джерело зображення: pixabay.com

Схожі статті: -

Ось кілька статей, які допоможуть вам отримати більш детальну інформацію про програмування Python Socket, тому просто перейдіть за посиланням.

  1. 25 найдивовижніших запитань та відповідей на інтерв'ю Python
  2. Кар'єра в Python
  3. Які переваги та обмеження використання Python?
  4. Важлива різниця Python від Ruby Performance
  5. Вступ до програмування сокетів на PHP
  6. Програмування сокетів на Java | Метод класу розетки