Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Chat-serveri esimerkki Infernolle Limbolla

Sivun loppuun

jalski [28.01.2010 13:26:03]

#

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.

nörtti [04.02.2010 07:28:48]

#

https://www.ohjelmointiputka.net/koodivinkit/25268-limbo-yksinkertainen-chat-serveri-ja-chat-asiakas

Jokotai [04.02.2010 18:18:06]

#

Haukkua tulee totaalisestia kommentoimattomuudesta. Kommentoisit edes mitä funktiot tekevät.

jalski [04.02.2010 19:18:55]

#

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.

Chiman [04.02.2010 19:55:54]

#

jalski kirjoitti:

Yritin kyllä pitää funktioiden nimet kuvaavina:

search:

etsii asiakasta asiakastaulukosta hakemistopolun perusteella

Eikö esim. searchClientByPath tai searchClient olisi osuvampi?

Metabolix [04.02.2010 20:42:12]

#

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

jalski [04.02.2010 21:28:47]

#

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

jalski [05.02.2010 16:42:21]

#

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.

jalski [05.02.2010 20:24:32]

#

Kommentit lisätty, asiakasohjelma tulee myöhemmin.

Jokotai [06.02.2010 12:13:41]

#

Nyt se on hyvä :)

jalski [08.02.2010 22:37:19]

#

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.

jalski [10.02.2010 22:48:12]

#

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.

jalski [13.02.2010 13:48:38]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta