Postitin koodivinkkeihin aiemmin joulukalenterissa lupaamani chat-serveri esimerkin Infernolle Limbo-ohjelmointikielellä.
Ohjelma koostuu muutamasta säikeestä:
listenthread:
kuuntelee yhteydenottoja
managerthread:
Hoitaa "kirjanpidon", viestien ja tapahtumien välitykset asiakkaille.
workerthread:
Palvelee asiakasta, jokaista asiakasta varten luodaan omansa.
init:
Pääohjelmassa hoidetaan ikkunankäsittely debug-tiedolle: tapahtumat, yleiset viestit ja asiakaslista.
Ohjelmaan on toteutettu kaikki chat-serverin perustoiminnot: nimen asetus, viestit kaikille ja yksityisviestit.
Tällä hetkellä koodivinkki löytyy vain haun kautta. Tutustukaa ja haukkukaa pois.
https://www.ohjelmointiputka.net/koodivinkit/
Haukkua tulee totaalisestia kommentoimattomuudesta. Kommentoisit edes mitä funktiot tekevät.
Yritin kyllä pitää funktioiden nimet kuvaavina:
search:
etsii asiakasta asiakastaulukosta hakemistopolun perusteella
Tämä toimii siis siten, että Inferno luo jokaista tcp-yhteyttä varten hakemiston omalla numerollaan /net/tcp/ hakemistopolkuun.
hakemiston sisällä on kuusi tiedostoa: ctl, data, listen, local, remote, status
näistä esimerkki käyttää:
data = vastaannotto ja lähetys tapahtuvat tätä lukemalla ja kirjoittamalla
remote = tätä lukemalla saa vastapuolen osoitteen
searchnick:
etsii asiakasta id:n perusteella (=nick) asiakastaulukosta.
Säikeiden nimien pitäisi itsessään olla melko kuvaavia.
jalski kirjoitti:
Yritin kyllä pitää funktioiden nimet kuvaavina:
search:
etsii asiakasta asiakastaulukosta hakemistopolun perusteella
Eikö esim. searchClientByPath tai searchClient olisi osuvampi?
Vinkin omassa keskustelussa esimerkkeinä "selkeistä" nimistä mainitsemasi rdfd ym. eivät todellakaan ole selkeitä. Vai tunnistaisitko itse vieraasta koodista muuttujat rfd ja rdfd heti? "Ahaa, näiden on oltava remote file descriptor ja read data file descriptor!" En muuten noista täsmennyksistäkään ymmärrä, mihin kyseisiä muuttujia käytetään; pitäisi edelleenkin tuskalla ja vaivalla perehtyä koko koodiin.
Funktioidenkaan nimistä voi päätellä, mitä ne oikeastaan tekevät. Chimanin ehdotukset ovat huomattavasti selkeämpiä.
Metabolix kirjoitti:
Vinkin omassa keskustelussa esimerkkeinä "selkeistä" nimistä mainitsemasi rdfd ym. eivät todellakaan ole selkeitä. Vai tunnistaisitko itse vieraasta koodista muuttujat rfd ja rdfd heti? "Ahaa, näiden on oltava remote file descriptor ja read data file descriptor!"
Tässä tapauksessa valitsemani nimet ovat kylläkin yhteneviä muun järjestelmän kanssa. Jos tutustut Infernon järjestelmä kirjastoihin niin huomaat, että:
Connection adt on määritelty seuraavasti:
Connection : adt { dfd : ref FD; # data file cfd : ref FD; # control file dir : string; # pathname of line directory };
sys->dial palauttaa Connection adt:n, missä dfd descriptori on avoinna kirjoittamista ja lukemista varten (datan lähetys ja vastaanotto).
Ohjelmassa käytetty sys->listen palauttaa Connection adt:n, missä dfd on nil. Käyttäjän on itse avattava datatiedosto hyväksyäkseen yhteyden muodostuksen.
Olen vain lisännyt etukirjaimen alkuperäiseen määrittelyyn eritelläkseni käyttötarkoituksen (w=kirjoitus, r=luku).
Haukuista ja kommenteista viisastuneena postitan illalla kommenteilla ja selityksillä varustetun siistityn version. Ehkä se saa jonkun tutustumaan Infernoon ja Limbo-ohjelmointiin.
Tekaisen tuolle vielä viikonlopun aikana kunnollisen graafisella käyttöliittymällä varustetun asiakasohjelman ja lisään sen myöhemmin malliksi.
Kommentit lisätty, asiakasohjelma tulee myöhemmin.
Nyt se on hyvä :)
Asiakas ohjelmaa tehdessäni huomasin yhden ajatusvirheen chat-serveri ohjelman tiedon vastaanotto koodissa: Asiakasohjelman lähettäessä serverille useamman komennon kerralla, niin koko liuta tulkitaan yhtenä komentona ja näin ollen osa jätetään käsittelemättä. Korjaan tuon samalla, kun postitan viimeistellyn asiakas-ohjelman, jossa on jo toimiva versio toteutettuna.
Korjasin nyt sitten kunnolla tuon tiedon vastaanoton chat-serverin koodissa, eli tieto vastaanotetaan nyt tavu kerrallaan ja tavujen pohjalta muodostetaan unicode-merkkejä (1-3 tavua per merkki). Postitan korjatun version viikonloppuun mennessä, kunhan ensin siistin ja lisään hiukan kommentteja.
Valmiina on myös alle 250 rivinen graafinen asiakasohjelma, jonka postitan koodivinkkeihin chat-serverin mukaan myös malliksi.
Postitin muokatun ja kommenteilla höystetyn Chat-serverin ja tälle Chat-asiakasohjelman äskettäin koodivinkkeihin.
Kuva kertoo enemmän, kuin tuhat huonoa sanaa: http://www.tip9ug.jp/who/jalih/chatti.jpg
Tulen varmaan tekemään vielä muutoksia ja lisäyksiä, kunhan aika antaa oikeilta töiltä myöten. Mielestäni tuo on esimerkkinä kuitenkin jo kohtuullisen hyvä ja toimiva.
Aihe on jo aika vanha, joten et voi enää vastata siihen.