Tietokoneiden näyttöjä, joissa näkyy kuvaa automaatiolaboratorion laitteistosta. Monitoreiden takana näkyy sama laitteisto kuin kuvissa.

timohei.net / Opintojaksot / Soveltava ohjelmointi / Python-ohjelmointi /
Internet-yhteyden yli viestiminen

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).

Palvelinohjelma

Klikkaa alla olevasta ohjelmalistauksesta, niin se vaihtuu versioksi, johon annetaan ohjelmaa käynnistettäessä portin numero. Toisella klikkauksella listaus palaa alkuperäiseksi.

Ajettaessa ohjelmaa IDLEstä käsin, se käynnistetään editorissa Run > Run... Customized-komennolla (pikanäppäin Shift+F5), jolloin IDLE kysyy ohjelmaa käynnistettäessä sys.argv-parametrin arvoa.

# Sanomanvälityspalvelin # message_server.py # Käyttö: message_server.py # # Vaihda ohjelmaversiota klikkaamalla! # import socket, sys, time def Main(): pysayta_palvelin = False # Alustetaan palvelimen pysäyttävä muuttuja aluksi "pois päältä" host = 'localhost' # Palvelimen osoite: tämän koneen sisäinen yhteys > localhost; # yhteys verkon yli > ip-osoite portti = 20000 # Portin numero kiinteästi ohjelmoituna (klikkaa!) while not pysayta_palvelin: # Tätä luuppia kierretään niin kauan # kun palvelinta halutaan pitää päällä print('Aletaan kuunnella porttia ' + str[portti]) s = socket.socket() # Luodaan olio s socket-moduulin socket-funktiolla. Ohjelmoija # keksii olion nimen; se voisi olla vaikkapa liitin, jolloin # jatkossa ko. olioon ja sen kautta muodostettuun yhteyteen # viitattaisiin nimellä liitin. Nyt olion nimi on lyhyesti s. s.bind((host, portti)) s.listen(1) c, osoite = s.accept() print('Osoite = ' + str(osoite)) while True: vastaanotettu_data = c.recv(1024) lahetettava_data = str(vastaanotettu_data.decode('utf-8')) print(lahetettava_data) if lahetettava_data == 'quit': print('Vastaanotettiin quit') pysayta_palvelin = True if not vastaanotettu_data: break if not pysayta_palvelin: lahetettava_data = 'localhost täällä! Lähetit merkkijonon '\ + lahetettava_data + '\nLopeta painamalla q<enter>' c.send(lahetettava_data.encode('utf-8')) else: print('Asiakkaalta tuli lopetuskäsky!') break print('Suljetaan portti') c.close() time.sleep(1) if __name__ == '__main__': Main()





Asiakasohjelma

# 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
        print("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
    print(vastaanotettu_viesti.decode("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
Päivitetty 30.11.2023

<<  Edellinen
(15) Python vs. muut kielet
Sivu 16/17Seuraava >>
(17) Harjoitustyö (Python)
© Timo Heikkinen | timo piste heikkinen at oamk piste fi