Internet-yhteyden yli viestiminen
461 531 626
Tässä käydään läpi yksinkertainen menetelmä Internetin yli tapahtuvaan viestittelyyn. Menetelmää voidaan käyttää esimerkiksi mittaustietojen lähettämiseen tietokantapalvelimelle.
Joillakin oli viimeksi ongelmia saada yhteys asiakasohjelmasta ulkopuoliseen palvelinohjelmaan, kun ohjelma käynnistettiin Windowsin komentoriviltä (cmd) vaikka yhteys toimi IDLEn kautta ongelmitta. Googlailin asiaa, ja ilmeisesti kyse on Windowsin palomuurista. Python-ympäristön asennuksen yhteydessä IDLE on ilmeisesti saanut luvan liikennoidä palomuurin läpi. Komentoriviltä käynnistettäessä lupaa ei välttämättä olekaan ja yhteys jää syntymättä. Kannattaa kokeilla kytkeä palomuuri testailun ajaksi pois päältä, josko yhteys toimisi. Muista kuitenkin kytkeä palomuuri testailun jälkeen takaisin päälle!
Liikennöinti perustuu client/server-malliin, ts. yksi osapuoli on asiakas (client) ja toinen palvelin (server).
Klikkaa alla olevasta ohjelmalistauksesta, niin se vaihtuu versioksi, johon annetaan ohjelmaa käynnistettäessä portin numero. Toisella klikkauksella listaus palaa alkuperäiseksi.
# Sanoman lähettävä asiakasohjelma (client) # message_client.py import socket palvelin = "joku.com "# Annan palvelimen nimen tunneilla tai erikseen pyydettäessä portti =12345 # Annan tunneilla (tai erikseen pyydettäessä) jokaiselle oman porttinumeron s = socket.socket()# Luodaan yhteysliitäntä (socket) s.connect((palvelin, portti))# Avataan yhteys. Kahdet sulut tarvitaan, koska # connect()-tempulle välitettävä tieto on ns. tuple sanoma =input ("Anna lähetettävä sanoma: ")while sanoma != "q ":# WHILE-SILMUKAN ALKU s.send(sanoma.encode("utf-8 "))# Koodataan merkkijonot utf-8 -muotoon, jota palvelimella oleva ohjelma if sanoma == "quit ":# on ohjelmoitu myös käyttämään. Käyttämällä samaa koodausta kummassakin Tapetaan etäpalvelin ja lopetetaan tämä ohjelma! ")# päässä yhteyttä, saadaan mm. ääkköset break # välittymään oikein. vastaanotettu_viesti = s.recv(1024 )# Luetaan etäpalvelimelta # vastaanotettu viesti # ja talletaan se muuttujaan utf-8 "))# Merkkijono on lähetetty palvelimelta utf-8 -koodattuna, joten # käytetään samaa koodausta vastaanotetun viestin tulkkaamiseen. sanoma =input ("Anna seuraava sanoma: ")# Pyydetään uusi sanoma while-silmukan alussa lähetettäväksi # WHILE-SILMUKAN LOPPU s.close()# Katkaistaan yhteys hallitusti, kun on tultu while-silmukasta ulos # rivin 16 breakilla TAI while-silmukan ehdon muuttuessa arvoon False