socket — socket-moduuli¶
Tämä moduuli tarjoaa pääsyn BSD-socket-rajapintaan.
Ero CPythoniin
Tehokkuuden ja yhdenmukaisuuden vuoksi socket-objektit toteuttavat MicroPythonissa suoraan stream-rajapinnan (tiedostomaisen). CPythonissa socket on muunnettava tiedostomaiseksi objektiksi makefile()-metodilla. MicroPython tukee tätä metodia edelleen (mutta se ei tee mitään), joten kun yhteensopivuus CPythonin kanssa on tärkeää, käytä sitä varmuuden vuoksi.
Socket-osoitteen muoto(t)¶
socket-moduulin natiivi socket-osoitemuoto on läpinäkymätön tietotyyppi, jonka getaddrinfo()-funktio palauttaa ja jota on käytettävä tekstimuotoisen osoitteen (mukaan lukien numeeriset osoitteet) resolvointiin:
sockaddr = socket.getaddrinfo('www.micropython.org', 80)[0][-1]
# You must use getaddrinfo() even for numeric addresses
sockaddr = socket.getaddrinfo('127.0.0.1', 80)[0][-1]
# Now you can use that address
sock.connect(sockaddr)
getaddrinfo()-funktion käyttö on tehokkain (sekä muistin että prosessoritehon kannalta) ja siirrettävin tapa työskennellä osoitteiden kanssa.
socket-moduuli tarjoaa myös CPythonin kanssa yhteensopivan tavan määrittää osoitteita käyttäen monikoita, kuten alla kuvataan. OpenMV Camissa socket-moduuli on sisäänrakennettu; numeeriset osoitteet voidaan antaa suoraan monikkomuodossa, mutta verkkotunnukset on ensin resolvoitava funktiolla getaddrinfo().
Yhteenvetona:
Käytä aina
getaddrinfo()-funktiota isäntänimien resolvointiin.Alla kuvattuja monikko-osoitteita voidaan käyttää oikotienä numeerisille osoitteille, nopeisiin kokeiluihin ja interaktiiviseen käyttöön.
Monikko-osoitemuoto socket-moduulille:
IPv4: (ipv4_address, port), jossa ipv4_address on merkkijono, joka sisältää pistemerkinnällä esitetyn numeerisen IPv4-osoitteen, esim.
"8.8.8.8", ja port on kokonaisluku porttinumero välillä 1-65535. Verkkotunnuksia ei hyväksytä ipv4_address-arvoksi; resolvoi ne ensin funktiollagetaddrinfo().IPv6: (ipv6_address, port, flowinfo, scopeid), jossa ipv6_address on merkkijono, joka sisältää kaksoispistemerkinnällä esitetyn numeerisen IPv6-osoitteen, esim.
"2001:db8::1", ja port on kokonaisluku porttinumero välillä 1-65535. flowinfo on oltava 0. scopeid on rajapinnan laajuustunniste link-local-osoitteille. Verkkotunnuksia ei hyväksytä ipv6_address-arvoksi; resolvoi ne ensin funktiollagetaddrinfo().
Funktiot¶
- socket.getaddrinfo(host: str, port: int, af: int = 0, type: int = 0, proto: int = 0, flags: int = 0, /) List[Tuple]¶
Muuntaa host/port-argumentin 5-monikoiden sekvenssiksi, joka sisältää kaikki tarvittavat argumentit kyseiseen palveluun yhdistetyn socketin luomiseksi. Argumentteja af, type ja proto (joilla on sama merkitys kuin
socket-funktiolle) voidaan käyttää suodattamaan, minkätyyppiset osoitteet palautetaan. Jos parametria ei ole määritetty tai se on nolla, kaikki osoiteyhdistelmät voidaan palauttaa (mikä edellyttää suodatusta käyttäjän puolella).Tuloksena saatavalla 5-monikoiden listalla on seuraava rakenne:
(family, type, proto, canonname, sockaddr)Seuraava esimerkki näyttää, miten yhdistetään annettuun URL-osoitteeseen:
s = socket.socket() # This assumes that if "type" is not specified, an address for # SOCK_STREAM will be returned, which may be not true s.connect(socket.getaddrinfo('www.micropython.org', 80)[0][-1])
Suositeltu suodatusparametrien käyttö:
s = socket.socket() # Guaranteed to return an address which can be connect'ed to for # stream operation. s.connect(socket.getaddrinfo('www.micropython.org', 80, 0, SOCK_STREAM)[0][-1])
Ero CPythoniin
CPython nostaa
socket.gaierror-poikkeuksen (OSError-aliluokka), jos tässä funktiossa tapahtuu virhe. MicroPythonilla ei olesocket.gaierror-poikkeusta, vaan se nostaa OSError-poikkeuksen suoraan. Huomaa, ettägetaddrinfo()-funktion virhenumerot muodostavat erillisen nimiavaruuden eivätkä välttämättä täsmääerrno-moduulin virhenumeroiden kanssa.getaddrinfo()-virheiden erottamiseksi ne esitetään negatiivisina lukuina, kun taas tavalliset järjestelmävirheet ovat positiivisia lukuja (virhenumerot ovat saatavilla poikkeusobjektine.args[0]-ominaisuuden kautta). Negatiivisten arvojen käyttö on väliaikainen yksityiskohta, joka voi muuttua tulevaisuudessa.
Vakiot¶
- socket.IPPROTO_IP: int¶
IP-protokollataso. Käytetään level-argumenttina metodissa
setsockopt()yhdessäIP_*-vaihtoehtojen kanssa.
- socket.IPPROTO_TCP: int¶
TCP-protokolla. Sinun ei tarvitse välittää tätä
socket-funktiolle (SOCK_STREAM-socket-tyyppi valitsee sen automaattisesti); sen ainoa todellinen käyttö on level-argumenttina metodissasetsockopt()yhdessäTCP_*-vaihtoehtojen kanssa.
- socket.SOL_SOCKET: int¶
Socket-vaihtoehtotaso. Käytetään level-argumenttina metodissa
setsockopt()yhdessäSO_*-vaihtoehtojen kanssa.
- socket.SO_REUSEADDR: int¶
Salli socketin sitoutua osoitteeseen/porttiin, joka on edelleen
TIME_WAIT-tilassa.
- socket.SO_KEEPALIVE: int¶
Ota käyttöön keep-alive-koettimien jaksottainen lähetys yhdistetyssä socketissa.
- socket.SO_SNDTIMEO: int¶
Lähetyksen aikakatkaisu millisekunteina, välitetään value-argumenttina metodille
setsockopt().
- socket.SO_RCVTIMEO: int¶
Vastaanoton aikakatkaisu millisekunteina, välitetään value-argumenttina metodille
setsockopt().
- socket.IP_ADD_MEMBERSHIP: int¶
Liity multicast-ryhmään.
IPPROTO_IP-tasonsetsockopt()-vaihtoehto.
- socket.IP_DROP_MEMBERSHIP: int¶
Poistu multicast-ryhmästä.
IPPROTO_IP-tasonsetsockopt()-vaihtoehto.
- socket.TCP_NODELAY: int¶
Poista Naglen algoritmi käytöstä.
IPPROTO_TCP-tasonsetsockopt()-vaihtoehto.
- socket.MSG_PEEK: int¶
Metodeille
recv()/recvfrom(): palauta data poistamatta sitä syötejonosta.
- socket.MSG_DONTWAIT: int¶
Metodeille
recv()/recvfrom(): suorita operaatio ei-estävässä tilassa.
Luokat¶
- class socket.socket(af: int = AF_INET, type: int = SOCK_STREAM, proto: int = IPPROTO_TCP, /)¶
Luo uusi socket käyttäen annettua osoiteperhettä, socket-tyyppiä ja protokollanumeroa. proto-arvon määrittäminen ei useimmissa tapauksissa ole tarpeellista (eikä suositeltavaa); type-argumentti valitsee tarvittavan protokollan automaattisesti:
# Create STREAM TCP socket socket(AF_INET, SOCK_STREAM) # Create DGRAM UDP socket socket(AF_INET, SOCK_DGRAM)
- close() None¶
Merkitse socket suljetuksi ja vapauta kaikki resurssit. Kun näin tapahtuu, kaikki socket-objektin tulevat operaatiot epäonnistuvat. Etäpää saa EOF-merkinnän, jos protokolla tukee sitä.
Socketit suljetaan automaattisesti, kun ne kerätään roskienkeräyksessä, mutta on suositeltavaa
close()-sulkea ne nimenomaisesti heti, kun olet lopettanut niiden käytön.
- listen(backlog: int = 2) None¶
Salli palvelimen hyväksyä yhteyksiä. Jos backlog on määritetty, sen on oltava vähintään 0 (jos se on pienempi, se asetetaan arvoon 0); se määrittää hyväksymättömien yhteyksien määrän, jonka järjestelmä sallii ennen kuin se hylkää uudet yhteydet. Jos sitä ei ole määritetty, valitaan oletusarvoisesti järkevä arvo.
- accept() Tuple['socket', Tuple]¶
Hyväksy yhteys. Socketin on oltava sidottu osoitteeseen ja kuunneltava yhteyksiä. Paluuarvo on pari (conn, address), jossa conn on uusi socket-objekti, jota voidaan käyttää datan lähettämiseen ja vastaanottamiseen yhteydellä, ja address on yhteyden toisessa päässä socketiin sidottu osoite.
- send(bytes: bytes) int¶
Lähetä dataa socketiin. Socketin on oltava yhdistetty etäsocketiin. Palauttaa lähetettyjen tavujen määrän, joka voi olla pienempi kuin datan pituus (”short write”).
- sendall(bytes: bytes) None¶
Lähetä kaikki data socketiin. Socketin on oltava yhdistetty etäsocketiin. Toisin kuin
send(), tämä metodi yrittää lähettää kaiken datan lähettämällä sen lohko lohkolta peräkkäin.Tämän metodin toiminta ei-estävissä socketeissa on määrittelemätön. Tämän vuoksi MicroPythonissa on suositeltavaa käyttää sen sijaan
write()-metodia, jolla on sama ”ei short write -kirjoituksia” -käytäntö estäville socketeille ja joka palauttaa lähetettyjen tavujen määrän ei-estävissä socketeissa.
- recv(bufsize: int, flags: int = 0) bytes¶
Vastaanota dataa socketista. Paluuarvo on tavuobjekti, joka edustaa vastaanotettua dataa. Kerralla vastaanotettavan datan enimmäismäärä määritetään bufsize-arvolla.
Valinnainen flags-argumentti on viestilippujen (
MSG_PEEK,MSG_DONTWAIT) bittikohtainen OR, joilla on sama merkitys kuin CPythonissa.
- sendto(bytes: bytes, address: Any) int¶
Lähetä dataa socketiin. Socketin ei pitäisi olla yhdistetty etäsocketiin, koska kohdesocket määritetään address-argumentilla.
- recvfrom(bufsize: int, flags: int = 0) Tuple[bytes, Tuple]¶
Vastaanota dataa socketista. Paluuarvo on pari (bytes, address), jossa bytes on tavuobjekti, joka edustaa vastaanotettua dataa, ja address on dataa lähettävän socketin osoite.
Katso
recv()-funktiosta selitys valinnaiselle flags-argumentille.
- setsockopt(level: int, optname: int, value: int | bytes) None¶
Aseta annetun socket-vaihtoehdon arvo. Tarvittavat symboliset vakiot on määritelty socket-moduulissa (SO_* jne.). value voi olla kokonaisluku tai puskuria edustava tavumainen objekti.
- settimeout(value: float | None) None¶
Aseta aikakatkaisu estäville socket-operaatioille. value-argumentti voi olla ei-negatiivinen liukuluku, joka ilmaisee sekunteja, tai None. Jos annetaan nollasta poikkeava arvo, myöhemmät socket-operaatiot nostavat
OSError-poikkeuksen, jos aikakatkaisuaika on kulunut ennen kuin operaatio on valmistunut. Jos annetaan nolla, socket asetetaan ei-estävään tilaan. Jos annetaan None, socket asetetaan estävään tilaan.Siirrettävä ja yleinen vaihtoehto on käyttää
select.poll-objektia. Tämä mahdollistaa useiden objektien odottamisen samanaikaisesti (eikä vain socketien, vaan yleisten stream-objektien, jotka tukevat pollausta). Esimerkki:# Instead of: s.settimeout(1.0) # time in seconds s.read(10) # may timeout # Use: poller = select.poll() poller.register(s, select.POLLIN) res = poller.poll(1000) # time in milliseconds if not res: # s is still not ready for input, i.e. operation timed out
Ero CPythoniin
CPython nostaa
socket.timeout-poikkeuksen aikakatkaisun tapahtuessa; se onOSError-aliluokka. MicroPython nostaa sen sijaan OSError-poikkeuksen suoraan. Jos käytätexcept OSError:poikkeuksen kiinniottoon, koodisi toimii sekä MicroPythonissa että CPythonissa.
- setblocking(flag: bool) None¶
Aseta socketin estävä tai ei-estävä tila: jos flag on false, socket asetetaan ei-estävään, muutoin estävään tilaan.
Tämä metodi on lyhennys tietyille
settimeout()-kutsuille:sock.setblocking(True)vastaa kutsuasock.settimeout(None)sock.setblocking(False)vastaa kutsuasock.settimeout(0)
- makefile(mode: str = 'rb', buffering: int = 0, /) Any¶
Palauta socketiin liittyvä tiedosto-objekti. Tarkka palautettava tyyppi riippuu makefile()-funktiolle annetuista argumenteista. Tuki rajoittuu vain binääritiloihin (’rb’, ’wb’ ja ’rwb’). CPythonin argumentteja encoding, errors ja newline ei tueta.
Ero CPythoniin
Koska MicroPython ei tue puskuroituja streameja, buffering-parametrin arvot ohitetaan ja käsitellään ikään kuin se olisi 0 (puskuroimaton).
Ero CPythoniin
makefile()-funktion palauttaman tiedosto-objektin sulkeminen sulkee MYÖS alkuperäisen socketin.
- read(size: int | None = None) bytes¶
Lue socketista enintään size tavua. Palauttaa tavuobjektin. Jos size-arvoa ei anneta, se lukee kaiken socketista saatavilla olevan datan EOF:ään asti; sellaisenaan metodi ei palaa ennen kuin socket on suljettu. Tämä funktio yrittää lukea niin paljon dataa kuin on pyydetty (ei ”short read” -lukuja). Tämä ei kuitenkaan ehkä ole mahdollista ei-estävällä socketilla, jolloin palautetaan vähemmän dataa.
- readinto(buf: bytearray | memoryview, nbytes: int | None = None) int¶
Lue tavuja buf-puskuriin. Jos nbytes on määritetty, lue enintään niin monta tavua. Muutoin lue enintään len(buf) tavua. Aivan kuten
read(), tämä metodi noudattaa ”ei short read -lukuja” -käytäntöä.Paluuarvo: luettujen ja buf-puskuriin tallennettujen tavujen määrä.
- write(buf: bytes) int¶
Kirjoita tavupuskuri socketiin. Tämä funktio yrittää kirjoittaa kaiken datan socketiin (ei ”short write” -kirjoituksia). Tämä ei kuitenkaan ehkä ole mahdollista ei-estävällä socketilla, jolloin palautettu arvo on pienempi kuin buf-puskurin pituus.
Paluuarvo: kirjoitettujen tavujen määrä.