Sett opp en Internett-server i Python ved å bruke Socket
01 av 10Introduksjon til Socket
Som et supplement til nettverksklientopplæringen, viser denne veiledningen hvordan du implementerer en enkel webserver i Python . For å være sikker, dette er ingen erstatning for Apache eller Zope. Det er også mer robuste måter å implementere webtjenester i Python ved å bruke moduler som BaseHTTPServer. Denne serveren bruker kun socket-modulen.
Du vil huske at socket-modulen er ryggraden i de fleste Python-netttjenestemoduler. Som med den enkle nettverksklienten, illustrerer det å bygge en server med den det grunnleggende om webtjenester i Python på en transparent måte. BaseHTTPServer importerer selv socketmodulen for å påvirke en server.
02 av 10Kjører servere
Som en gjennomgang skjer alle nettverkstransaksjoner mellom klienter og servere. I de fleste protokoller spør klientene om en bestemt adresse og mottar data.
Innenfor hver adresse kan en rekke servere kjøre. Grensen ligger i maskinvaren. Med tilstrekkelig maskinvare (RAM, prosessorhastighet osv.), kan den samme datamaskinen fungere som en webserver, en ftp-server oge-postserver(pop, smtp, imap eller alle de ovennevnte) alt på samme tid. Hver tjeneste er knyttet til en port. Porten er bundet til en stikkontakt. Serveren lytter til den tilknyttede porten og gir informasjon når forespørsler mottas på den porten.
03 av 10Kommuniserer via stikkontakter
Så for å påvirke en nettverkstilkobling må du kjenne verten, porten og handlingene som er tillatt på den porten. De fleste webservere kjører på port 80. Men for å unngå konflikt med en installert Apache-server, vil vår webserver kjøre på port 8080. For å unngå konflikt med andre tjenester er det best å beholde HTTP-tjenester på port 80 eller 8080. Dette er de to vanligste. Selvfølgelig, hvis disse brukes, må du finne en åpen port og varsle brukere om endringen.
Som med nettverksklienten, bør du merke deg at disse adressene er de vanlige portnumrene for de forskjellige tjenestene. Så lenge klienten ber om riktig tjeneste på rett port på rett adresse, vil kommunikasjon fortsatt skje. Googles e-posttjenesten, for eksempel, kjørte ikke i utgangspunktet på de vanlige portnumrene, men fordi de vet hvordan de får tilgang til kontoene sine, kan brukere fortsatt få posten sin.
I motsetning til nettverksklienten, er alle variabler i serveren kablet. Enhver tjeneste som forventes å kjøre konstant, bør ikke ha variablene til sin interne logikk satt på kommandolinjen. Den eneste varianten av dette ville være hvis du av en eller annen grunn ville at tjenesten skulle kjøres av og til og på forskjellige portnumre. Hvis dette var tilfelle, ville du imidlertid fortsatt kunne se systemtiden og endre bindinger tilsvarende.
Så vår eneste import er socket-modulen.
|_+_||_+_|Deretter må vi deklarere noen få variabler.
04 av 10
Verter og havner
Som allerede nevnt, må serveren kjenne verten den skal knyttes til og porten den skal lytte til. For våre formål skal vi la tjenesten gjelde for alle vertsnavn i det hele tatt.
|_+_||_+_|Porten, som nevnt tidligere, vil være 8080. Vær oppmerksom på at hvis du bruker denne serveren sammen med nettverksklienten, må du endre portnummeret som brukes i den program .
05 av 10
Opprette en stikkontakt
Om du skal be om informasjon eller forkynne den, for å få tilgang til Internett , må vi lage en stikkontakt. Syntaksen for denne samtalen er som følger:
|_+_||_+_|De anerkjente stikkontaktfamiliene er:
- AF_INET: IPv4-protokoller (både TCP og UDP)
- AF_INET6: IPv6-protokoller (både TCP og UDP)
- AF_UNIX: UNIX-domeneprotokoller
De to første er åpenbart internettprotokoller. Alt som reiser over internett kan nås i disse familiene. Mange nettverk kjører fortsatt ikke på IPv6. Så, med mindre du vet noe annet, er det tryggest å bruke IPv4 som standard og bruke AF_INET.
Sokkeltypen refererer til typen kommunikasjon som brukes gjennom kontakten. De fem sokkeltypene er som følger:
- SOCK_STREAM: en tilkoblingsorientert TCP-bytestrøm
- SOCK_DGRAM: UDP-overføring av datagrammer (selvstendige IP-pakker som ikke er avhengige av klient-server-bekreftelse)
- SOCK_RAW: en rå socket
- SOCK_RDM: for pålitelige datagrammer
- SOCK_SEQPACKET: sekvensiell overføring av poster over en tilkobling
De aller mest vanlige typene er SOCK_STEAM og SOCK_DGRAM fordi de fungerer på de to protokollene til IP-pakken (TCP og UDP). De tre sistnevnte er mye sjeldnere og støttes kanskje ikke alltid.
Så la oss lage en socket og tilordne den til en variabel.
|_+_||_+_| 06 av 10Stille inn stikkontaktalternativer
Etter å ha opprettet stikkontakten, må vi stille inn kontaktalternativene. For ethvert socketobjekt kan du angi socketalternativene ved å bruke setsockopt()-metoden. Syntaksen er som følger:
socket_object.setsockopt(nivå, alternativnavn, verdi) For våre formål bruker vi følgende linje:|_+_|
07 av 10
Begrepet 'nivå' refererer til kategoriene av alternativer. For alternativer på sokkelnivå, bruk SOL_SOCKET. For protokollnumre vil man bruke IPPROTO_IP. SOL_SOCKET er en konstant attributt for kontakten. Nøyaktig hvilke alternativer som er tilgjengelige som en del av hvert nivå bestemmes av operativsystemet ditt og om du bruker IPv4 eller IPv6.
Dokumentasjonen for Linux og relaterte Unix-systemer finnes i systemdokumentasjonen. Dokumentasjonen for Microsoft-brukere finner du på MSDN-nettstedet. Når dette skrives, har jeg ikke funnet Mac-dokumentasjon om socket-programmering. Siden Mac er omtrent basert på BSD Unix, vil den sannsynligvis implementere et komplett utvalg av alternativer.
For å sikre gjenbruk av denne kontakten, bruker vi alternativet SO_REUSEADDR. Man kan begrense serveren til kun å kjøre på åpne porter, men det virker unødvendig. Vær imidlertid oppmerksom på at hvis to eller flere tjenester er distribuert på samme port, er effektene uforutsigbare. Man kan ikke være sikker på hvilken tjeneste som vil motta hvilken pakke med informasjon.
Til slutt er '1' for en verdi verdien som forespørselen på kontakten er kjent med i programmet. På denne måten kan et program lytte på en stikkontakt på svært nyanserte måter.
Binder porten til stikkontakten
Etter å ha opprettet stikkontakten og angitt alternativene, må vi binde porten til stikkontakten.
|_+_||_+_|Når bindingen er ferdig, ber vi nå datamaskinen om å vente og lytte på den porten.
|_+_||_+_|Hvis vi ønsker å gi tilbakemelding til personen som ringer serveren, kan vi nå skrive inn en utskriftskommando for å bekrefte at serveren er oppe og går.
08 av 10Håndtering av en serverforespørsel
Etter å ha konfigurert serveren, må vi nå fortellePythonhva du skal gjøre når en forespørsel kommer på den gitte porten. For dette refererer vi til forespørselen etter verdien og bruker den som argumentet for en vedvarende mens-løkke.
Når en forespørsel sendes, bør serveren godta forespørselen og opprette et filobjekt for å samhandle med det.
|_+_||_+_|I dette tilfellet bruker serveren samme port for lesing og skriving. Derfor får makefile-metoden et argument 'rw'. Nulllengden på bufferstørrelsen lar ganske enkelt den delen av filen bestemmes dynamisk.
09 av 10 Sende data til klientenMed mindre vi ønsker å lage en enkelthandlingsserver, er neste trinn å lese input fra filobjektet. Når vi gjør det, bør vi være forsiktige med å fjerne overflødig mellomrom.
|_+_||_+_|Forespørselen vil komme i form av en handling, etterfulgt av en side, protokollen og versjonen av protokollen som brukes. Hvis man ønsker å betjene en nettside, deler man denne inngangen for å hente den forespurte siden og leser den siden inn i en variabel som så skrives til socket-filobjektet. En funksjon for å lese en fil inn i en ordbok finner du i bloggen.
For å gjøre denne opplæringen litt mer illustrerende for hva man kan gjøre med socket-modulen, vil vi gi avkall på den delen av serveren og i stedet vise hvordan man kan nyansere presentasjonen av data. Skriv inn de neste linjene i program .
|_+_||_+_| 10 av 10Endelig analyse og nedleggelse
Hvis man sender en nettside, er den første linjen en fin måte å introdusere dataene til en nettleser på. Hvis det utelates, vil de fleste nettlesere som standard gjengi HTML . Men hvis man inkluderer det, må 'OK' følges av to nye linjetegn. Disse brukes til å skille protokollinformasjonen fra sideinnholdet.
Syntaksen til den første linjen, som du sikkert kan ane, er protokoll, protokollversjon, meldingsnummer og status. Hvis du noen gang har gått til en nettside som har flyttet, har du sannsynligvis fått en 404-feil. 200-meldingen her er ganske enkelt den bekreftende meldingen.
Resten av utdataene er ganske enkelt en nettside delt opp over flere linjer. Du vil merke at serveren kan programmeres til å bruke brukerdata i utgangen. Den siste linjen gjenspeiler nettforespørselen slik den ble mottatt av serveren.
Til slutt, som avsluttende handlinger av forespørselen, må vi lukke filobjektet og serverkontakten.
|_+_||_+_|Lagre nå dette programmet under et gjenkjennelig navn. Etter at du har kalt den med 'python program_name.py', hvis du programmerte en melding for å bekrefte at tjenesten kjører, skal denne skrives ut på skjermen. Terminalen vil da se ut til å stoppe. Alt er som det skal være. Åpne nettleseren og gå til localhost:8080. Du bør da se utdataene fra skrivekommandoene vi ga. Vær oppmerksom på at jeg for plassens skyld ikke implementerte feilhåndtering i dette programmet. Imidlertid bør ethvert program som slippes ut i 'ville' gjøre det.