ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ Π² Python

БСгодня ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ программирования сокСтов Python. ΠœΡ‹ создадим сСрвСрныС ΠΈ клиСнтскиС прилоТСния Π½Π° Python.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сокСтов

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сокСтов Python, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚Ρ€Π΅Ρ… интСрСсных Ρ‚Π΅ΠΌΠ°Ρ… – Socket Server, Socket Client ΠΈ Socket.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сСрвСр? Π‘Π΅Ρ€Π²Π΅Ρ€ – это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ запросов ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ обслуТиваСт ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… соотвСтствСнно.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ эту услугу. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рСсурсы ΠΊ сСрвСру, ΠΈ сСрвСр ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° этот запрос.

Socket – это конСчная Ρ‚ΠΎΡ‡ΠΊΠ° Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° связи ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСром ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса, ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…. Для любого взаимодСйствия с ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ€Ρ‚ сокСта.

Основная Ρ†Π΅Π»ΡŒ этого руководства ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ сокСтов – ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ сСрвСр сокСтов ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сСрвСра сокСтов Π² Python.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π Π°Π½Π΅Π΅ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ сокСта Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рСсурсы Ρƒ сСрвСра, ΠΈ сСрвСр ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° этот запрос.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ, ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ модСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ³ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ. Π¨Π°Π³ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π‘Π΅Ρ€Π²Π΅Ρ€ сокСтов

ΠœΡ‹ сохраним ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сСрвСра сокСтов, ΠΊΠ°ΠΊ socket_server.py. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ соСдинСниС, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ сокСта.

Π—Π°Ρ‚Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСром ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс хоста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ socket.gethostname(). РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ адрСс ΠΏΠΎΡ€Ρ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Ρ‹ΡˆΠ΅ 1024, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° мСньшС 1024 Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ для стандартного ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° сСрвСра:

Π˜Ρ‚Π°ΠΊ, наш сСрвСр сокСтов Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 5000 ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвСр Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π» Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ клиСнтского соСдинСния, просто ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ условиС if ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ break. Π¦ΠΈΠΊΠ» while ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для бСсконСчного запуска сСрвСрной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ оТидания клиСнтского запроса.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ сокСта

ΠœΡ‹ сохраним ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сокСта python ΠΊΠ°ΠΊ socket_client.py. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ привязки.

ОсновноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСрной ΠΈ клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² сСрвСрной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ адрСс хоста ΠΈ адрСс ΠΏΠΎΡ€Ρ‚Π° вмСстС.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° сокСта:

Π’Ρ‹Π²ΠΎΠ΄

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, сначала запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сСрвСра сокСтов. Π—Π°Ρ‚Π΅ΠΌ запуститС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ПослС этого Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ· клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π—Π°Ρ‚Π΅ΠΌ снова Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ сСрвСрной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

НаконСц, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Β«Π΄ΠΎ свидания» ΠΈΠ· клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΎΠ±Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НиТС ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π½Π° ΠΌΠΎΠ΅ΠΌ тСстовом ΠΏΡ€ΠΎΠ³ΠΎΠ½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ сСрвСра сокСтов ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ сСрвСр сокСтов Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 5000, Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‚Π°ΠΊΠΆΠ΅ трСбуСтся ΠΏΠΎΡ€Ρ‚ сокСта для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сСрвСру. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ€Ρ‚ назначаСтся случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ клиСнтского соСдинСния. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это 57822.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ИспользованиС сокСтов Π² Android

Π‘ΠΎΠ·Π΄Π°Π½ΠΎ большоС количСство ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠ°ΠΊ для Android, Ρ‚Π°ΠΊ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ОБ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ установлСния соСдинСниСй ΠΏΠΎ сСти. К Ρ‚Π°ΠΊΠΈΠΌ прилоТСниям относятся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, мСссСндТСры ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтСй WhatsApp, Viber. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, для установлСния соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°ΠΊΠΈΠΌΠΈ прилоТСниями ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сокСты.

Π‘ΠΎΠΊΠ΅Ρ‚ (socket) β€” это интСрфСйс, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… устройств, находящихся Π² ΠΎΠ΄Π½ΠΎΠΉ сСти. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ²: клиСнтский (Socket) ΠΈ сСрвСрный (ServerSocket). Π“Π»Π°Π²Π½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ сСрвСр Β«ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚Β» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ Π½Π° устройствС, Β«ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚Β» Π΅Π³ΠΎ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ запросы, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ этому сСрвСру, зная Π΅Π³ΠΎ IP-адрСс ΠΈ ΠΏΠΎΡ€Ρ‚. Π’ Android сокСты для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP/IP, Π²Π°ΠΆΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся гарантированная доставка ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ устройства Π΄ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ использования сокСтов

Для опрСдСлСния ΠΏΡ€Π°Π² Π² манифСстС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² Ρ„Π°ΠΉΠ» AndroidManifest.xml Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку :

Π’Π΅ΠΏΠ΅Ρ€ΡŒ android-прилоТСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ сСти.

Π”Π°Π»Π΅Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрного сокСтного соСдинСния с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ сообщСния. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ android-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π‘Π΅Ρ€Π²Π΅Ρ€Π½ΠΎΠ΅ java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π² IDE Eclipse с использованиСм ΠΏΠ°ΠΊΠ΅Ρ‚Π° concurrent. Π’ ΠΊΠΎΠ½Ρ†Π΅ страницы ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Π° прилоТСния.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ android-сокСт

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ andriod-прилоТСния прСдставлСн Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅. Π€ΠΎΡ€ΠΌΠ° прилоТСния Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° тСкстового сообщСния ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ установлСния соСдинСния сСрвСром, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСния ΠΈ закрытия соСдинСния.

ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ создадим ΠΈΠ· Π΄Π²ΡƒΡ… классов : класс взаимодСйствия с сСрвСрным сокСтом Connection ΠΈ класс стандартной активности MainActivity.

Класс Connection

Класс взаимодСйствия с сСрвСром Connection ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈ создании (Ρ‡Π΅Ρ€Π΅Π· конструктор) ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ : host ΠΈ port. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Connection Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ· активности ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ :

ΠœΠ΅Ρ‚ΠΎΠ΄ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
openConnectionΠœΠ΅Ρ‚ΠΎΠ΄ открытия сокСта/соСдинСния. Если сокСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚, Ρ‚ΠΎ ΠΎΠ½ сначала закрываСтся.
closeConnectionΠœΠ΅Ρ‚ΠΎΠ΄ закрытия сокСта
sendDataΠœΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния ΠΈΠ· активности.
finalizeΠœΠ΅Ρ‚ΠΎΠ΄ освобоТдСния рСсурсов

Листинг Connection

Класс активности MainActivity

Π’ активности MainActivity ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сСрвСра : host, port. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ IP-адрСс сСрвСра для Π’Π°ΡˆΠ΅Π³ΠΎ android-ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ localhost (127.0.0.1), ΠΈΠ½Π°Ρ‡Π΅ Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с сСрвСром Π²Π½ΡƒΡ‚Ρ€ΠΈ Andriod-систСмы. Кнопки интСрфСйса связаны с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ обращСния ΠΊ классу Connection. Кнопки ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния mBtnSend ΠΈ закрытия соСдинСния mBtnClose с сСрвСром Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ стартС прилоТСния. ПослС установлСния соСдинСния с сСрвСром доступ ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ открываСтся.

Листинг активности

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ управлСния сокСтным соСдинСниСм

НиТС прСдставлСны ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий, связанных с Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΎΠΊ интСрфСйса. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру выполняСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ доступа ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅, для Ρ‡Π΅Π³ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ runOnUiThread. Для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния сСрвСру Ρ‚Π°ΠΊΠΆΠ΅ создаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Π‘Π΅Ρ€Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ 2 класса : Server ΠΈ ConnectionWorker. Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ класс Server Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ взаимодСйствия с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ с использованиСм ConnectionWorker Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ConnectionWorker Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Socket для чтСния сообщСний ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° сокСта.

Листинг ConnectionWorker

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ класс

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ класс Server создадим с использованиСм ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° util.concurrent. На страницС описания сСтСвого ΠΏΠ°ΠΊΠ΅Ρ‚Π° java.net ΠΈ сСрвСрного ServerSocket Π±Ρ‹Π» ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сСрвСрного модуля с использованиСм ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Thread, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π΅Π³ΠΎ остановки : cΡ‚Π°Ρ€Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Thread.stop объявлСн Deprecated ΠΈ ΠΏΡ€Π΅Π΄Π°Π½ ΡΡ‚Ρ€ΠΎΠΆΠ°ΠΉΡˆΠ΅ΠΉ Π°Π½Π°Ρ„Π΅ΠΌΠ΅, Π° бСзопасная инструкция Thread.interrupt бСзопасна, ΠΊ соТалСнию, ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ²Π½Ρ‹ΠΌ счСтом Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ (отправляСт сообщСниС ΠΏΠΎΡ‚ΠΎΠΊΡƒ : Β«ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡΡŒΒ»). Π£ΡΠ»Ρ‹ΡˆΠΈΡ‚ Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ·Ρ‹Π² ΠΏΠΎΡ‚ΠΎΠΊ остаСтся ΠΏΠΎΠ΄ вопросом – всС зависит ΠΎΡ‚ Ρ€Π°Π·Π°Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сСрвСр «снаруТи» Π² сСрвСрный класс Server Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ 2 Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… интСрфСйс Callable класса : CallableDelay ΠΈ CallableServer. Класс CallableDelay Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя, ΠΏΠΎ истСчСнии ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ остановит 2-ΠΎΠΉ сСрвСрный ΠΏΠΎΡ‚ΠΎΠΊ взаимодСйствия с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ CallableDelay ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для дСмонстрации остановки ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ util.concurrent.

Листинг CallableDelay

CallableDelay ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ†ΠΈΠΊΠ» с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ послСднСго Ρ†ΠΈΠΊΠ»Π° cycle ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ†ΠΈΠΊΠ», останавливаСт Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ futureTask[1] ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ сокСт. Π’ консоль выводится ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС.

Листинг CallableServer

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ CallableServer Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π° для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². ΠŸΡ€ΠΈ стартС (ΠΌΠ΅Ρ‚ΠΎΠ΄ call) создаСтся сСрвСрный сокСт ServerSocket ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания соСдинСния с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° stopTask, Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Β«Π·Π°Π΄Π°Ρ‡ΠΈΒ» Ρ‚ΠΈΠΏΠ° FutureTask с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ serverSoket.accept Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сокСт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ConnectionWorker ΠΈ Π΅Π³ΠΎ запуска Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. А сСрвСр (ΠΏΠΎΡ‚ΠΎΠΊ) ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ оТиданию ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π’ случаС закрытия сокСта (Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ внСшнСй Π·Π°Π΄Π°Ρ‡ΠΈ FutureTask с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ) Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Exception, Π³Π΄Π΅ выполняСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° закрытия сокСта; ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π΅ основной Ρ†ΠΈΠΊΠ» прСрываСтся ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Листинг сСрвСрного класса Server

CΠ΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ класс Server создаСт Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (callable1, callable2), Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ· Π½ΠΈΡ… Π΄Π²Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ futureTask ΠΈ запускаСт Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ execute исполнитСля executor. ПослС этого контролируСтся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ… Π·Π°Π΄Π°Ρ‡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ isTasksDone. ΠŸΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния ΠΎΠ±Π΅ΠΈΡ… Π·Π°Π΄Π°Ρ‡ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Ρ†ΠΈΠΊΠ» Ρ€Π°Π±ΠΎΡ‚Ρ‹ executor’Π°.

Π”Π²Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… описанных Π²Ρ‹ΡˆΠ΅ класса (CallableDelay, CallableServer) Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² листинг.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр Π½Π° Python для Π·Π°Ρ€ΠΎΠ΄Ρ‹ΡˆΠ΅ΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΠΈΠΊ. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π·Π°Π½ΡƒΠ΄Π½ΠΎΠΉ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ «Π Ρ‡Π’ΠΎ Π’Π°ΠšΠΎΠ• Π‘Π•Π Π’Π•Π . «. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. Данная ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсна Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Π½Π΅ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр, ΠΊΡ‚ΠΎ Π·Π°Π±ΠΈΠ²Π°Π΅Ρ‚ Π² Ρ‡Π΅Ρ€Π΅ΠΏ Π³Π²ΠΎΠ·Π΄ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ содСрТаниС ΠΆΠ΅Π»Π΅Π·Π° ΠΈ ΡΡ‚Π°Ρ‚ΡŒ ΡƒΠΌΠ½Π΅Π΅, ΠΊΡ‚ΠΎ Π΄ΡƒΠΌΠ°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр это Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π·Π°ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠ΅ для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π΅Ρ€Π°.

Π˜Ρ‚Π°ΠΊ, приступим ΠΊ описанию ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹:

Π‘Π΅Ρ€Π²Π΅Ρ€, Π½Π° IP адрСсС ΠΏΠΎ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ IP адрСс с ΠΏΠΎΡ€Ρ‚ΠΎΠΌ . IP ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ IP ΠΏΡ€ΠΈΡ‘ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹. ΠŸΠΎΡ€Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ значСния Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0-65535.

Π‘Π΅Ρ€Π²Π΅Ρ€ Π²ΠΈΠ΄ΠΈΡ‚ Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½ΡŽΠ΄ΡΡ‹ Иванова Ивана ΠΈ просто отсылаСт ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

— Π’ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΌΡ‹ максимально ΠΊΡ€Π°Ρ‚ΠΊΠΎ расписали ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр. РаспишСм Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ побольшС.
— Π­Π™ Π‘Π’ΠžΠ™! А Ρ‡ΠΎ Π΅Ρ‰Ρ‘ Π·Π° TCP ΠΈ UPD?
— Π‘Π΅ΠΊΡƒΠ½Π΄ΠΎΡ‡ΠΊΡƒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ UPD ΠΈ TCP?
Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅ это Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ двумя устройствами. Они ΠΎΠ±Π° Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠ°ΠΊ Π»ΠΎΠ»ΠΈΡ…Π°Π½Ρ‚Π΅Ρ€ ΠΈ ΠΌΠΈΠ»Ρ„Ρ…Π°Π½Ρ‚Π΅Ρ€. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

— Π­ΠΉ, Π‘Π°Π½Ρ‘ΠΊ, я Ρ‚ΡƒΡ‚ ΠΊΠ°ΠΌΠ½ΠΈ Π½Π°ΡˆΡ‘Π». МоТно я Π² тСбя Π΅Π³ΠΎ ΠΊΠΈΠ½Ρƒ?
— Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π¨Π°Π½Ρ‘ΠΊ, ΠΊΠΈΠ΄Π°ΠΉ
— Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ!
*ΠšΠΈΠ½ΡƒΠ» ΠΊΠ°ΠΌΠ½ΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ мягко ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π‘Π°Π½Ρ‘ΠΊ успСл ΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒ всС*

Π­Ρ‚ΠΎ Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ TCP. Он прСвосходит UPD Π² цСлостности Π΄Π°Π½Π½Ρ‹Ρ…, строго ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ большСй надёТности, Π½ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ Π½Π΅Π³ΠΎ мСньшСй ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ.

— Π­ΠΉ, Π‘Π°Π½Ρ‘ΠΊ, Π»ΠΎΠ²ΠΈ!
*ΠšΠΈΠ½ΡƒΠ» ΠΊΠ°ΠΌΠ½ΠΈ Ρ‚Π°ΠΊ сильно, Ρ‡Ρ‚ΠΎ Π‘Π°Π½Ρ‘ΠΊ сразу Π΄Π°Π» Π΄Ρ‘Ρ€Ρƒ, успСв сначала ΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠ°ΠΌΠ½Π΅ΠΉ*
— *****, Π½Π΅ ΠΏΠΎΠΉΠΌΠ°Π», Π² Π»ΠΈΡ†ΠΎ ΠΏΠΎΠΏΠ°Π»

Π­Ρ‚ΠΎ Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ UPD. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ своСго «ΠΏΡ€ΠΈΠ»Π΅ΠΆΠ½ΠΎΠ³ΠΎ» Π±Ρ€Π°Ρ‚Π° ΠΎΠ½ Π±ΠΎΠ»Π΅Π΅ быстрый Π² Π·Π°ΠΊΠΈΠ΄Ρ‹Π²Π°Π½ΠΈΠΈ камня. Но вмСсто строгой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΈΠ΄Π°Π΅Ρ‚ всё Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄ΠΈΡ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‡Π΅Ρ€ΠΏΠ°Π½Ρ‘ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

Для Π½Π°Ρ‡Π°Π»Π° сдСлаСм Π²Π΅Ρ‡Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ сСрвСр.
Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· сокСты Π² Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ socket

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»ΡƒΡˆΠ°Π»ΠΊΡƒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик ΠΈ Π·Π°Ρ€Π°Π½Π΅Π΅ готовая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ° с посылкой. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ наш ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик. Наш ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик Π²ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ 1 ΠšΠ‘ (1024 Π±Π°ΠΉΡ‚). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ящик, Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ящик Π½Π΅ опустССт.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик Π²Π²Π΅Ρ€Ρ… Π΄Π½ΠΎΠΌ ΠΈ высыпаСтС ΠΎΡ‚Ρ‚ΡƒΠ΄Π° всё Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°.

— Но Π·Π°Ρ‡Π΅ΠΌ Π² Π½Π°Ρ‡Π°Π»Π΅ Π½Π°ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅?
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‡Ρ‚ΠΎ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Если Π±Ρ‹ ΠΌΡ‹ этого Π½Π΅ сдСлали, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±Ρ‹ стоял ΠΌΠΎΠ»Ρ‡Π°Π».

Π Π°Π· ΡƒΠΆ с сСрвСром ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ

Ну Π²ΠΎΡ‚, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ запускС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎ IP, ΠΎΡ‚ сСрвСра ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ «ΠŸΡ€ΠΈΠ²Π΅Ρ‚», Π° сСрвСр ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ нашС «Π˜ Ρ‚Π΅Π±Π΅ ΠΏΡ€ΠΈΠ²Π΅Ρ‚!», Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ нас ΠΎΡ‚Π²Π΅Ρ‚.
ΠŸΡ€ΠΎΡˆΡƒ Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эти ΠΊΠ°Π½Π°Π»Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ, Π° ΠΏΠΎ сСму для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ идСально ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ RSA).

НСмного Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… вопросов:

МоТно Π»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ сокСтов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ консоль? Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹?

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ просто ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сообщСния, Π° послС получСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· условия.

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚?

Π§Ρ‚ΠΎ Ссли я ΡƒΠΊΠ°ΠΆΡƒ Ρ‡ΡƒΠΆΠΎΠΉ адрСс Π² ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠΈ сСрвСра?

Π’Π°ΠΌ просто Π²Ρ‹Π±ΡŒΠ΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

МоТно Π»ΠΈ ΠΏΠΎ сокСтам ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ, Π²ΠΈΠ΄Π΅ΠΎ ΠΈ Ρ‚.Π΄.?

Π”Π°, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ. Π€ΠΎΡ‚ΠΎ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ это просто Π΄Π°Π½Π½Ρ‹Π΅. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ, Π° соотвСтствСнно ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.

НСбольшая справочка ΠΏΠΎ основным ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ для создания сокСтов:

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ источники, ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки:

И Π½Π° этом ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ вступлСниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр Π² Python для Π·Π°Ρ€ΠΎΠ΄Ρ‹ΡˆΠ΅ΠΉ. Напомню Ρ‡Ρ‚ΠΎ данная ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ создана для Truehard ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠ², ΠΎΠ½Π° создана для Ρ‚Π΅Ρ… ΠΊΡ‚ΠΎ Π½Π΅ разбираСтся Π² сокСтах ΠΈ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ Python #18: Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π’ΠΎΡ‚ ΠΌΡ‹ ΠΈ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ самого Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ β€” обсуТдСния взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСром ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. Как ΠΎΠ½ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ? КакиС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сокСт?

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»

TCP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌΠΈ двусторонний ΠΊΠ°Π½Π°Π» ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Благодаря TCP ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с соблюдСниСм порядка ΠΈΡ… очСрСдности, с автоматичСским Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя TCP Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ потСрянныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, выполняСмых Π½Π°Π΄ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ, слишком ΠΌΠ½ΠΎΠ³ΠΎ.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP β€” Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π½Π΅ создавая логичСскоС соСдинСниС. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ TCP, взаимодСйствия ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UDP Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. Π­Ρ‚ΠΎ услоТняСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠΈ Π² прилоТСниях, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Π½ΡƒΠΆΠ½Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ TCP.

ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

Π‘Π΅Ρ€Π²Π΅Ρ€, принимая соСдинСниС присваиваСт своСму сокСту ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚. ΠŸΠΎΡ€Ρ‚ β€” число Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² TCP, UDP, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅, для ΠΊΠ°ΠΊΠΎΠ³ΠΎ прилоТСния Π² систСмС ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π΄Π°Π½Π½Ρ‹ΠΉ IP-ΠΏΠ°ΠΊΠ΅Ρ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹ с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ 0-1023 нСльзя β€” ΠΎΠ½ΠΈ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΠ΄ слуТСбныС сСтСвыС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 21 β€” FTP, 80 β€” HTTP ΠΈ Ρ‚.Π΄.). ΠšΠ»ΠΈΠ΅Π½Ρ‚, отправляя Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой сокСт. Π”Π²Π° сокСта с ΠΎΠ±ΠΎΠΈΡ… сторон ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ соСдинСниС ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ…. НуТно ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ TCP, создаСтся Π΄Π²Π° сокСта: ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… β€” ΡΠ»ΡƒΡˆΠ°ΡŽΡ‰ΠΈΠΉ (listen). Он ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания ΠΈ активизируСтся ΠΏΡ€ΠΈ появлСнии Π½ΠΎΠ²ΠΎΠ³ΠΎ соСдинСния. ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ соСдинСния, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ β€” сокСт для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ (accept). Π­Ρ‚ΠΎ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… сокСта, Π½Π΅ ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅

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

ΠžΠ±Ρ‰ΠΈΠ΅Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹Π΅ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠ΅
socket β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сокСтbind β€” ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ сокСт ΠΊ IP-адрСсу ΠΈ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΌΠ°ΡˆΠΈΠ½Ρ‹connect β€” ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ соСдинСниС
send β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅listen β€” ΠΏΡ€ΠΎΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎ готовности ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ соСдинСния
recv β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅accept β€” ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ запрос Π½Π° установку соСдинСния
close β€” Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ соСдинСниС

Π Π°Π±ΠΎΡ‚Π° Π’Π‘Π  ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ с сокСтом Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π’Π‘Π , посмотрим Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΆΠ΅. ПояснСниС Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ отправляСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя)

ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

БСрвСрная Ρ‡Π°ΡΡ‚ΡŒ:

Ѐункция socket() ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ созданиС сокСта. Π’ Π½Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: communication domain ΠΈ type of socket. AF_INET β€” это ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π΅Ρ‚ ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π°ΡˆΠ΅ΠΌΡƒ сокСту. Π’ΠΈΠΏ сокСта β€” SOCK_STREAM β€” ΠΎΠ½ опрСдСляСт сокСт ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ двусторонний ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ Π’Π‘Π . Боздалась конСчная Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ β€” сокСт. Ѐункция socket() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с сокСтом, ΠΊΠ°ΠΊ с Ρ„Π°ΠΉΠ»ΠΎΠΌ β€” Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π²/ΠΈΠ· Π½Π΅Π³ΠΎ. ΠœΠ΅Ρ‚ΠΎΠ΄ encode примСняСтся здСсь, Ρ‚.ΠΊ. Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ сСти Π² Π²ΠΈΠ΄Π΅ Π±Π°ΠΉΡ‚ΠΎΠ².

# сСрвСрная Ρ‡Π°ΡΡ‚ΡŒ
from socket import *
import time

s = socket(AF_INET, SOCK_STREAM) # БоздаСтся сокСт ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° TCP
s.bind((Β», 10000)) # ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ Π΅ΠΌΡƒ ΠΏΠΎΡ€Ρ‚ 10000
s.listen(10) # МаксимальноС количСство ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… запросов

while True:
client, addr = s.accept() # Π°ΠΊΡ†Π΅ΠΏΡ‚ΠΈΠΌ запрос Π½Π° соСдинСниС
print(client)
print(«Запрос Π½Π° соСдинСниС ΠΎΡ‚ %sΒ» % str(addr))
timestr = time.ctime(time.time()) + Β«\nΒ»
client.send(timestr.encode(β€˜utf-8’)) #ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π² ΠΈΡ… Π² Π±Π°ΠΉΡ‚Ρ‹
client.close() # Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС

Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π² срСдС программирования, Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ Π²Π°ΡˆΠ΅ΠΌΡƒ сСрвСру Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² вашСй локальной сСти:

ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ

ΠšΠ»ΠΈΠ΅Π½Ρ‚ устанавливаСт соСдинСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° connect (Π² нашСм случаС, localhost, Ρ‚.ΠΊ. сСрвСр ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС). Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, сСрвСр отправляСт Π½Π°ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² β€” наша Π·Π°Π΄Π°Ρ‡Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² строки юникода

from socket import *

s = socket(AF_INET, SOCK_STREAM) # создаСм Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ сокСт, ΠΊΠ°ΠΊ Ρƒ сСрвСра
s.connect((β€˜localhost’, 10000)) # коннСктимся с сСрвСром
tm = s.recv(1024) # ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1024 Π±Π°ΠΉΡ‚Π° Π΄Π°Π½Π½Ρ‹Ρ…
s.close() # Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС
print(Β«Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя: %sΒ» % tm.decode(β€˜utf-8’)) # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π² Π±Π°ΠΉΡ‚Ρ‹

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ клиСнтской части (послС запуска сСрвСра):

ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сСрвСрной части (послС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°):

ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΠΎΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ сокСт Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

Как происходит ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅/Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…?

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ, Π±Π°ΠΉΡ‚Ρ‹, измСняСмыС строки Π±Π°ΠΉΡ‚ΠΎΠ²:

Код / Π΄Π°Π½Π½Ρ‹Π΅Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ print(type())
i= β€˜Data’— строка
bi = b’Data’— строка Π±Π°ΠΉΡ‚ΠΎΠ²
ba = bytearray(bi)β€” измСняСмая строка Π±Π°ΠΉΡ‚ΠΎΠ²
i2 = bi.decode(β€˜cp1251’)β€” ΠΈΠ· строки Π±Π°ΠΉΡ‚ Π² unicode-строку
bi2 = i.encode(β€˜koi8-r’)β€” ΠΈΠ· unicode-строки Π² строку Π±Π°ΠΉΡ‚
ba2 = bytearray(i, β€˜utf-8’)β€” ΠΈΠ· unicode-строки Π² массив Π±Π°ΠΉΡ‚ΠΎΠ²

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌ сообщСний

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ простой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ привСтствиС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ отправляСт ΠΎΡ‚Π²Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. ΠšΠ»ΠΈΠ΅Π½Ρ‚, соотвСтствСнно, отправляСт привСтствиС сСрвСру ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚

from socket import *
import time

s = socket(AF_INET, SOCK_STREAM) # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сокСт TCP
s.bind((Β», 11111)) # ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΡ€Ρ‚ 11111
s.listen(5) # ΠΏΡΡ‚ΡŒ запросов максимум
while True: # ΠΏΠΎΠΊΠ° выполняСтся условиС (ΠΏΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ запросы Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°)
client, addr = s.accept() # ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ запрос Π½Π° соСдинСниС
data = client.recv(1000000) # ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ максимальноС количСство Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
print(β€˜ΠœΠ΅ΡΡΠ΅Π΄ΠΆ: β€˜, data.decode(β€˜utf-8’), β€˜, ΠΏΡ€ΠΈΡˆΠ»ΠΎ ΠΎΡ‚ Π½Π΅Π³ΠΎ: β€˜, addr)
msg = β€˜ΠšΡƒΠΏΠΈ виски’
client.send(msg.encode(β€˜utf-8’)) #ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π² ΠΈΡ… Π² Π±Π°ΠΉΡ‚Ρ‹
client.close()

# клиСнтская Ρ‡Π°ΡΡ‚ΡŒ
from socket import *

s = socket(AF_INET, SOCK_STREAM) # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сокСт TCP
s.connect((β€˜localhost’, 11111)) # ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ ΠΊ сСрвСру
msg = β€˜ΠŸΡ€ΠΈΠ²Π΅Ρ‚, сСрвСр’
s.send(msg.encode(β€˜utf-8’)) #ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π² ΠΈΡ… Π² Π±Π°ΠΉΡ‚Ρ‹
data = s.recv(1000000) #ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1000000 Π±Π°ΠΉΡ‚
print(β€˜Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ сСрвСра: β€˜, data.decode(β€˜utf-8’), β€˜, Π΄Π»ΠΈΠ½ΠΎΠΉ β€˜, len(data), β€˜ байт’) #ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС ΠΎΡ‚ сСрвСра, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π² Π±Π°ΠΉΡ‚Ρ‹ юникод
s.close()

JSON Instant Messaging

JIM β€” ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· TCP-сокСты (SOCK_STREAM) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ВсС сСтСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ проходят Π² Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠΌ прСдставлСнии. Π”Π°Π½Π½Ρ‹Π΅ Π² JSON-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π΅ JIM всСгда содСрТат Π΄Π²Π° поля: action ΠΈ time.

ПолС action Π·Π°Π΄Π°Π΅Ρ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ дСйствия β€” авторизация ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния ΠΈ Ρ‚.ΠΏ.

ПолС time ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ врСмя ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ сообщСниС (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ UNIX-врСмя β€” опрСдСляСтся ΠΊΠ°ΠΊ количСство сСкунд, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… с ΠΏΠΎΠ»ΡƒΠ½ΠΎΡ‡ΠΈ (00:00:00 UTC) 1 января 1970 Π³ΠΎΠ΄Π°)

JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² JIM ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ количСству символов. НапримСр, сам тСкст сообщСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ 500 символами. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ограничСния:

ПолС action β€” «ДСйствиС», 15 символов

ПолС response β€” «Код ΠΎΡ‚Π²Π΅Ρ‚Π° сСрвСра», 3 символа (Ρ†ΠΈΡ„Ρ€Ρ‹)

ПолС name β€” «Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‡Π°Ρ‚Π°Β». Π—Π΄Π΅ΡΡŒ максимум 25 символов;

Π’Π΅ΡΡŒ скомпилированный JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ Π² 640 символов.

АутСнтификация

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½Π°Π΄ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

ΠžΡ‚Π²Π΅Ρ‚Ρ‹ сСрвСра Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ response, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅) ΠΏΠΎΠ»Π΅ alert/error с тСкстом ошибки.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, авторизация

Авторизация β€” Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ условиС ΠΏΡ€ΠΈ использовании JIM, Ρ‚.Π΅. Π΅Π³ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ. Если авторизация Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠΆΠ½Π° Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ этапС, сСрвСр выдаст Π°Π»Π΅Ρ€Ρ‚ с ΠΊΠΎΠ΄ΠΎΠΌ 401. Если аутСнтификация всё ΠΆΠ΅ Π½ΡƒΠΆΠ½Π°, Ρ‚ΠΎ сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² рСспонзов:

<
Β«responseΒ»: 200,
Β«alertΒ»:Β»ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС/ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅Β»
>

<
Β«responseΒ»: 402,
«error»: «This could be «wrong password» or «no account with that name»»
>

<
Β«responseΒ»: 409,
Β«errorΒ»: Β«Someone is already connected with the given user nameΒ»
>

ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ сСрвСра Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ сообщСниСм β€œquit”:

Π’ сСти/ Π½Π΅ Π² сСти

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ своё присутствиС Π² Β«ΠΎΠ½Π»Π°ΠΉΠ½Π΅Β», ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ presence сообщСниС с ΠΏΠΎΠ»Π΅ΠΌ type

Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, сСрвСр посылаСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ probe-запрос для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ доступности ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

АлСрты ΠΈ ошибки сСрвСра

ΠšΠΎΠ΄Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚?
1xx β€” ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ сообщСния100 β€” Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅; 101 β€” Π²Π°ΠΆΠ½ΠΎΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅.
2xx β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅:200 β€” OK; 201 (created) β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создан; 202 (accepted) β€” ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅.
4xx β€” ошибка Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:400 β€” Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ запрос/JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚; 401 β€” Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½; 402 β€” Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³ΠΈΠ½/ΠΏΠ°Ρ€ΠΎΠ»ΡŒ; 403 (forbidden) β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½; 404 (not found) β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ/Ρ‡Π°Ρ‚ отсутствуСт Π½Π° сСрвСрС; 409 (conflict) β€” ΡƒΠΆΠ΅ имССтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π»ΠΎΠ³ΠΈΠ½ΠΎΠΌ; 410 (gone) β€” адрСсат сущСствуСт, Π½ΠΎ нСдоступСн (offline).
5xx β€” ошибка Π½Π° сторонС сСрвСра:500 β€” ошибка сСрвСра.

ОбмСн сообщСниями

Экшн msg для сСрвСра ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ β€” Π΅ΠΌΡƒ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сообщСниС адрСсату ΠΈΠ· поля to. Если Π½Π΅ Π·Π°Π΄Π°Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Π² ΠΏΠΎΠ»Π΅ encoding, Ρ‚ΠΎ сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ascii-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π² Β«Ρ‡Π°Ρ‚Β»

Π’ΠΎΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΠ»Π΅ to ставится Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠ° с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ‡Π°Ρ‚Ρ€ΡƒΠΌΠ°

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *