Дәріс №15. Python-ғы желілік қосымшалар.
Дәріс тақырыбы:Python-ғы желілік қосымшалар.
Дәрістің мақсаты:Python-ғы желілік қосымшаларды қарастыру, талдау.
Тақырып бойынша қарастырылатын сұрақтар:
1. Сокеттермен жұмыс.
2. Smtplib модулі.
1. Сокеттермен жұмыс.
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-да () келесі порциядағы байттар саны беріледі. Клиенттен аз деректер келуі мүмкін.
Клиент-бағдарламаның коды анық. Байланыс әдісі() қашықтағы хостпен байланысты орнатады (келтірілген мысалда ол сол машинада орналасқан). Деректер send() әдісімен беріледі және серверде болатынына ұқсас recv () әдісімен қабылданады.
Socket модулі бірнеше қосалқы функцияларға ие. Атап айтқанда, домендік атаулар жүйесімен (DNS ):
>>> import socket
>>> socket.gethostbyname('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 (). Ол интернет-сервистердің атауын порттардың жалпы қабылданған нөмірлеріне түрлендіруге мүмкіндік береді:
>>> for srv in 'http', 'ftp', 'imap', 'pop3', 'smtp':
... print socket.getservbyname(srv, 'tcp'), srv
...
80 http
21 ftp
143 imap
110 pop3
25 smtp
Socket Модулінің басқа функцияларын қажет болған жағдайда құжаттама бойынша зерттеуге болады.
2. Smtplib модулі.
Интернеттегі электрондық пошта хабары клиенттен серверге және серверлер арасында негізінен SMTP ( S imple m ail T ransfer P rotocol, қарапайым пошта жіберу ХАТТАМАСЫ) хаттамасы бойынша жіберіледі . SMTP және ESMTP протоколы (SMTP кеңейтілген нұсқасы) RFC 821 және RFC 1869- да сипатталған. Үшін SMTP стандартты кітапхана модульдер бар модуль smtplib. Электрондық пошта серверімен SMTP байланысын бастау үшін алдымен SMTP класты конструкторының көмегімен SMTP сессиясын басқару үшін нысанды жасау қажет:
smtplib.SMTP([host[, port]])
Host және port параметрлері пошта жіберілетін SMTP серверінің мекен-жайы мен портын береді . Әдепкі, port=25. Егер host орнатылса, конструктор өзі қосылымды орнатады, әйтпесе connect () әдісін бөлек шақыруға тура келеді . SMTP класының даналары барлық кең таралған SMTP протоколдары үшін әдістерге ие, бірақ поштаны жіберу үшін sendmail() және quit конструктор шақыру жеткілікті.():
# -*- coding: cp1251 -*-
from smtplib import SMTP
fromaddr = "student@mail.ru" # От кого
toaddr = "rnd@onego.ru" # Кому
message = """From: Student <%(fromaddr)s>
To: Lecturer <%(toaddr)s>
Subject: From Python course student
MIME-Version: 1.0
Content-Type: text/plain; charset=Windows-1251
Content-Transfer-Encoding: 8bit
Здравствуйте! Я изучаю курс по языку Python и
отправляю письмо его автору.
"""
connect = SMTP('mail.onego.ru')
connect.set_debuglevel(1)
connect.sendmail(fromaddr, toaddr, message % vars())
connect.quit()
Toaddr хабарламасында (To өрісінде ) және жіберу кезінде сәйкес келмеуі мүмкін екенін байқаған жөн . SMTP-сессия барысында алушы мен жөнелтуші SMTP-хаттама командаларымен беріледі. Жоғарыда көрсетілген мысалдарды іске қосқан кезде экранда жөнге келтіру ақпараты пайда болады (себебі жөндеу деңгейі 1-ге тең):
send: 'ehlo rnd.onego.ru\r\n'
reply: '250-mail.onego.ru Hello as3-042.dialup.onego.ru [195.161.147.4], pleased to meet you\r\n'
send: 'mail FROM: size=270\r\n'
reply: '250 2.1.0 ... Sender ok\r\n'
send: 'rcpt TO:\r\n'
reply: '250 2.1.5 ... Recipient ok\r\n'
send: 'data\r\n'
reply: '354 Enter mail, end with "." on a line by itself\r\n'
send: 'From: Student \r\n . . . '
reply: '250 2.0.0 iBPFgQ7q028433 Message accepted for delivery\r\n'
send: 'quit\r\n'
reply: '221 2.0.0 mail.onego.ru closing connection\r\n'
Бұл (бірнеше қысқартылған) жөндеу ақпаратынан клиент SMTP-серверіне (EHLO, MAIL FROM, RCPT TO, DATA, QUIT) командаларды жіберетінін көруге болады, ал ол командаларды орындайды және қайтару кодын қайтару арқылы жауап береді (reply).
Бір SMTP-сессия барысында quit () шақырмаса, қатарынан бірнеше хат жіберуге болады.
Ол үшін-қосылыстар ( helo(), ehlo(), esmtp(), helo(), mail(), rcpt(), vrfy(), send(), noop(), data (), SMTP-протоколының аттас командаларына сәйкес келетін әдістер бар.
DOCMD () әдісі арқылы SMTP серверіне еркін пәрменді де орнатуға болады. Келесі мысалда кейбір домен үшін хабарламалар кезегі сақталатын пошта серверінен SMTP протоколы бойынша өз серверіне поштаны уақыт өте келе қабылдайтын адамдар пайдалана алатын қарапайым сценарий көрсетілген:
from smtplib import SMTP
connect = SMTP('mx.abcde.ru')
connect.set_debuglevel(1)
connect.docmd("ETRN rnd.abcde.ru")
connect.quit()
Бұл қарапайым сценарий серверге ұсынады mx.abcde.ru негізгі домен пошта серверімен байланысуға тырысу rnd.abcde.ru және оған жиналған барлық поштаны жіберіңіз.
Smtplib сыныбымен жұмыс істеу кезінде.SMTP әртүрлі ерекшеліктер қозғалуы мүмкін. Кейбір тағайындау төменде келтірілген:
smtplib.SMTPException
Модульдің барлық ерекшеліктеріне арналған базалық сынып.
smtplib.SMTPServerDisconnected
Сервер кенеттен байланыс үзілді (немесе сервермен байланыс орнатылмаған).
smtplib.SMTP Response Exception
SMTP-сервер жауап коды бар барлық ерекшеліктер үшін базалық класс.
smtplib.SMTP Sender Refused
Жіберуші қабылдамады
smtplib.SMTPRecipientsRefused
Барлық алушылар сервермен қабылданбайды.
smtplib.SMTPDataError
Сервер осы хабарға белгісіз кодпен жауап берді.
smtplib.SMTP Connect Error
Байланыс орнату қатесі.
smtplib.SMTP Helo Error
Сервер HELO командасына дұрыс жауап бермеді немесе оны қабылдамады.
Достарыңызбен бөлісу: |