Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PythonΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 37

Автор Π ΠΎΠΌΠ°Π½ Π‘ΡƒΠ·ΠΈ

Π›ΡŽΠ±ΠΎΠΉ программист Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π΅ΠΌ эффСктивнСС, Ρ‡Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Β«Ρ€Π°ΡΡΡ‚Π°Π²ΠΈΡ‚ΡŒ скобки», вывСдя Β«ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ Π·Π° скобки». Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ программисты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ достаточно Β«Π»Π΅Π½ΠΈΠ²Ρ‹Β», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ динамичСского web–сайта Zope позволяСт Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Β«ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈΒ» ΠΈ «скобки» Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚ΡŒ максимального ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠ΄Π° (ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΈ сцСнариСв). ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ этому ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ: заимствованиС (acquisition).

ΠŸΡƒΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, сцСнарий, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚.ΠΏ.) располоТСн Π² ΠΏΠ°ΠΏΠΊΠ΅ Example. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этой ΠΏΠ°ΠΏΠΊΠΈ доступны ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· Π»ΡŽΠ±Ρ‹Ρ… Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΏΠ°ΠΏΠΎΠΊ. Π”Π°ΠΆΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ бСзопасности Π·Π°ΠΈΠΌΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ°ΠΏΠΊΠ°ΠΌΠΈ ΠΎΡ‚ ΠΏΠ°ΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΡ€Π½ΡŽ. ЗаимствованиС являСтся ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ Zope, Π±Π΅Π· понимания ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Zope слоТно Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ позволяСт ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ силы ΠΈ врСмя, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

Π‘Π°ΠΌΠΎΠ΅ интСрСсноС, Ρ‡Ρ‚ΠΎ Π·Π°ΠΈΠΌΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ· ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°ΠΏΠΎΠΊ. ΠŸΡƒΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, рядом с ΠΏΠ°ΠΏΠΊΠΎΠΉ Example находится ΠΏΠ°ΠΏΠΊΠ° Zigzag, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»Π΅ΠΆΠΈΡ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π΅Π³ΠΎ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ note). ΠŸΡ€ΠΈ этом Π² ΠΏΠ°ΠΏΠΊΠ΅ Example программиста интСрСсуСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ index_html, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ вызываСтся note. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ index_html Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ URI Π²Ρ€ΠΎΠ΄Π΅ http://zopeserver/Example/. А Π²ΠΎΡ‚ Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ note ΠΈΠ· Zigzag (ΠΈ Π² ΠΏΠ°ΠΏΠΊΠ΅ Example Π΅Π³ΠΎ Π½Π΅Ρ‚), Ρ‚ΠΎ URI Π±ΡƒΠ΄Π΅Ρ‚: http://zopeserver/Zigzag/Example/. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ Π² Zope отличаСтся ΠΎΡ‚ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ, скаТСм, Π² Unix: Π² ΠΏΡƒΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Β«Π·ΠΈΠ³Π·Π°Π³ΠΈΒ» Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°ΠΏΠΊΠΈ, Π΄Π°ΡŽΡ‰ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΈΠΌΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· этих ΠΏΠ°ΠΏΠΎΠΊ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ страницу, комбинируя ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько нСзависимых аспСктов.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой Π»Π΅ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ рассмотрСны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ использованию Python Π² web–прилоТСниях. Π‘Π°ΠΌΡ‹ΠΉ простой способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ web–прилоТСния β€” использованиС CGI–сцСнариСв. Π‘ΠΎΠ»Π΅Π΅ слоТным являСтся использованиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ для web–сСрвСра, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ mod_python. НаконСц, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π²Ρ€ΠΎΠ΄Π΅ Zope, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ спСциализированныС сСрвисы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ web–прилоТСния. 

ЛСкция #9: Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ прилоТСния Π½Π° Python.

Π’ этой Π»Π΅ΠΊΡ†ΠΈΠΈ рассматриваСтся рСализация Π½Π° Python ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ клиСнт–сСрвСрного прилоТСния, даСтся прСдставлСниС ΠΎ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΌ для сСти Internet ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ. Π­Ρ‚ΠΈΠΌΠΈ модулями ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ (TCP/IP, UDP/IP), Ρ‚Π°ΠΊ ΠΈ высокоуровнСвыС (HTTP, FTP, SMTP, POP3, IMAP, NNTP, …). Π—Π΄Π΅ΡΡŒ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСна Ρ€Π°Π±ΠΎΡ‚Π° с сокСтами (ΠΌΠΎΠ΄ΡƒΠ»ΡŒ socket) ΠΈ Ρ‚Ρ€ΠΈ модуля высокоуровнСвых ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² (urllib2, poplib, smtplib). ΠŸΡ€ΠΈ этом прСдполагаСтся, Ρ‡Ρ‚ΠΎ имССтся ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ IP–сСти ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅Π΅ сСрвисов, Π° Ρ‚Π°ΠΊΠΆΠ΅ прСдставлСниС ΠΎ систСмС WWW.

Π Π°Π±ΠΎΡ‚Π° с сокСтами

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ Π² IP–сСтях Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° клиСнт–сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ IP–пакСты для ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром. ΠšΠ»ΠΈΠ΅Π½Ρ‚ отправляСт запрос сСрвСру, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚. Π’ случаС с TCP/IP ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром устанавливаСтся соСдинСниС (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с двустороннСй ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ…), Π° Π² случаС с UDP/IP β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ (Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΌΠΈ) с Π½Π΅Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ доставкой.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ сСтСвой интСрфСйс IP–сСти ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π² этой сСти адрСс (IP–адрСс). Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π² сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ собствСнный IP–адрСс. ΠŸΡ€ΠΈ этом Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСтСвого интСрфСйса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько сСтСвых ΠΏΠΎΡ€Ρ‚ΠΎΠ². Для установлСния сСтСвого соСдинСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ свободный ΠΏΠΎΡ€Ρ‚ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ соСдинСниС с сСрвСрным ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ (listen) ΠΏΠΎΡ€Ρ‚ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСтСвом интСрфСйсС. ΠŸΠ°Ρ€Π° IP–адрСс ΠΈ ΠΏΠΎΡ€Ρ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ сокСт (Π³Π½Π΅Π·Π΄ΠΎ) β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ (ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ) Ρ‚ΠΎΡ‡ΠΊΡƒ сСтСвой ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Для создания соСдинСния TCP/IP Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π²Π° сокСта: ΠΎΠ΄ΠΈΠ½ Π½Π° локальной машинС, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сСтСвоС соСдинСниС ΠΈΠΌΠ΅Π΅Ρ‚ IP–адрСс ΠΈ ΠΏΠΎΡ€Ρ‚ Π½Π° локальной машинС, Π° Ρ‚Π°ΠΊΠΆΠ΅ IP–адрСс ΠΈ ΠΏΠΎΡ€Ρ‚ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ socket обСспСчиваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с сокСтами ΠΈΠ· Python. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ транспортный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ согласно сСмиуровнСвой ΠΌΠΎΠ΄Π΅Π»ΠΈ OSI (Open Systems Interconnection, взаимодСйствиС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… систСм), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ относятся ΠΊ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ, Ρ‡Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ описываСмых Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ².

Π£Ρ€ΠΎΠ²Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ OSI:

ЀизичСский

ΠŸΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎ физичСской Π»ΠΈΠ½ΠΈΠΈ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ физичСской Π»ΠΈΠ½ΠΈΠΈ.

ΠšΠ°Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ (Ethernet, PPP, ATM ΠΈ Ρ‚.ΠΏ.)

ΠšΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ², ΡΠΏΡ€Π°Π²Π»ΡΡΡΡŒ с ошибками, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠΌΠΈ Π½Π° физичСском ΡƒΡ€ΠΎΠ²Π½Π΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… физичСски Π΅Π΄ΠΈΠ½ΠΎΠΉ сСти.

Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ (IP)

ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΎΡ‚ ΡƒΠ·Π»Π° ΠΊ ΡƒΠ·Π»Ρƒ.

Вранспортный (TCP, UDP ΠΈ Ρ‚.ΠΏ.)

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ соСдинСния.

БСансовый

УправляСт сСансом соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ участниками сСти. НачинаСт, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ соСдинСния.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΡ… прСдставлСния ΠΏΡƒΡ‚Π΅ΠΌ прСобразования Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ². На этом ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ΅ (с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π²Ρ‹ΡˆΠ΅Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ уровня) ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (HTTP, FTP, SMTP, NNTP, POP3, IMAP ΠΈ Ρ‚.Π΄.)

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ сСтСвыС прилоТСния. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° сСрвиса.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ сокСт относится ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². ΠœΠΎΠ΄ΡƒΠ»ΡŒ socket ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½Ρ‹ UNIX ΠΈ Internet. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ своС сСмСйство ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Π°Π΄Ρ€Π΅ΡΠ°Ρ†ΠΈΡŽ. Π”Π°Π½Π½ΠΎΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΌΠ΅Π½ Internet, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ TCP/IP ΠΈ UDP/IP, поэтому для указания ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° ΠΏΡ€ΠΈ создании сокСта Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ константа socket.AF_INET.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° слСдуСт Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΡƒΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚β€“ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ. Π‘Π΅Ρ€Π²Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ строку ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ устройство ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ хостом (host), поэтому Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒΡΡ этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сСтСвоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π‘Π΅Ρ€Π²Π΅Ρ€:

import socket, string


def do_something(x):

 lst = map(None, x);

 lst.reverse();

 return string.join(lst, "")


HOST = "" # localhost

PORT = 33333

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

srv.bind((HOST, PORT))

while 1:

 print "Π‘Π»ΡƒΡˆΠ°ΡŽ ΠΏΠΎΡ€Ρ‚ 33333"

 srv.listen(1)

 sock, addr = srv.accept()

 while 1:

  pal = sock.recv(1024)

  if not pal:

   break

  print "ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΎΡ‚ %s:%s:" % addr, pal

  lap = do_something(pal)

  print "ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ %s:%s:" % addr, lap

  sock.send(lap)

 sock.close()

ΠšΠ»ΠΈΠ΅Π½Ρ‚:

import socket


HOST = ""    # ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ (localhost)

PORT = 33333 # ΠΏΠΎΡ€Ρ‚ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅

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

sock.connect((HOST, PORT))

sock.send("ΠŸΠΠ›Π˜ΠΠ”Π ΠžΠœ")

result = sock.recv(1024)

sock.close()

print "ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ:", result

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ русскиС Π±ΡƒΠΊΠ²Ρ‹: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ сокСт Π½Π° локальной машинС Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 33333, ΠΈ адрСсС 127.0.0.1. ПослС этого ΠΎΠ½ ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ (listen()) ΠΏΠΎΡ€Ρ‚. Когда Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅, принимаСтся (accept()) входящСС соСдинСниС. ΠœΠ΅Ρ‚ΠΎΠ΄ accept() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ β€” Socketβ€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ адрСс ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ соСдинСниС (ΠΏΠ°Ρ€Π° β€” IP–адрСс, ΠΏΠΎΡ€Ρ‚ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС). ПослС этого ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ recv() ΠΈ send() для общСния с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. Π’ recv() задаСтся число Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΏΠΎΡ€Ρ†ΠΈΠΈ. ΠžΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΈ мСньшСС количСство Π΄Π°Π½Π½Ρ‹Ρ….

Код программы–клиСнта достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½. ΠœΠ΅Ρ‚ΠΎΠ΄ connect() устанавливаСт соСдинСниС с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ хостом (Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ½ располоТСн Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ машинС). Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ send() ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ recv() β€” Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ происходит Π½Π° сСрвСрС.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ socket ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ частности, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с систСмой Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ (DNS):

>>> import socket

>>> socket.gethostbyaddr('www.onego.ru')

('www.onego.ru', [], ['195.161.136.4'])

>>> socket.gethostbyaddr('195.161.136.4')

('www.onego.ru', [], ['195.161.136.4'])

>>> socket.gethostname()

'rnd.onego.ru'

Π’ Π½ΠΎΠ²Ρ‹Ρ… вСрсиях Python появилась такая функция ΠΊΠ°ΠΊ socket.getservbyname(). Она позволяСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ наимСнования Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚β€“ΡΠ΅Ρ€Π²ΠΈΡΠΎΠ² Π² общСпринятыС Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚ΠΎΠ²: