Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: multiclient chat

Sivun loppuun

Jorgga [12.05.2007 22:14:39]

#

Juu oon tässä koodannu milti client chatin mutta siinä on kaksi ratkaisematonta ongelmaa...
1. kun clientit disconnectaa listasta ei häivy kaikki
ja
2. jos servu on täynnä niin clientille tulee suoraan disconnect mutta ei sitä disconnect messagea...

jos joku voi korjata niin linkki http://www.rogepost.com/n/3258844284 ja mulle voi korjattuna pistää osotteesee JorGGa@gmail.com

Anteeksi että nyt tälleen noobina kyselen jotain korjaamaan mun softaa mut nyt en saa enään taidoillani saa ratkaistua... Kiitos 8)

L2-K2 [13.05.2007 10:27:48]

#

Eipä näy koodia tuon linkin takana, tulee vaan seuraava teksti: "Cannot connect to SQL database: Can't create a new thread (errno 35); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug".

Jorgga [13.05.2007 14:05:43]

#

jaahas no upin omalle palvelimelle sitten... linkki: http://koti.mbnet.fi/jorgga/chat.zip

petrinm [13.05.2007 19:19:09]

#

Huomaa että ei ole mitään kauhean hyvää koodia, niin kuin osakseen tunnustitkin. Koodi ei ole kauhean hyvin rakennettu ja sen rakennetta kannattaisi muuttaa aika radikaalisti että koodi toimisi. Ensin koodissa kannattaisi tehdä joitain kohtia loppuun(näitä on jonkin verran), sitten parantaa rakenne täysin (eli miten esim kaikkia socketteja hallitaan jne.), ja sitten keskittyä pienempiin kohtiin joitten pitäisi onnistua helposti jos rakenne on hyvä.
Yhden ongelmallisen kohdan laitoin huomioon koodissa. On Error Resume Next- rivin virheiden seurannassa. Tämä hyppää virhe rivin yli eikä välitä siitä mitään. Tällöin et huomaa virhettä ja luulet sen kohdan toimivan.
Esim:

Private Sub Command1_Click()
   On Error Resume Next
   Dim ass As Integer
   For ass = ass To Form2.users.Text
      If socket(ass).State = 7 Then
         socket(ass).SendData msg.Text
         DoEvents
      End If
   Next
End Sub

Tässä lähetetään viesti kaikkiin sokketteihin välillä 1 - määrätty maksimi ,joitten tila on 7 eli yhdistetty. Esim yhdessä tapauksessa Socketteja on formissa ainoastaan yksi ja koodi etsii niitä maksimiin asti kutsuen socketteja joita ei ole luotu. Virheen ohituksen takia tätä ei huomioida ja koodin suoritus jatkuu. Tämä on yksi ongelma. Lisäksi tästäkin pätkästä löytyisi lisää korjattavaa.

En jaksa alkaa tarinoimaan enempää asioista joten suosittelen että aloitat melkein puhtaalta pöydältä ja mietit miten se olisi järkevä tehdä.

Jorgga [13.05.2007 22:27:29]

#

näinhän se on mutta ei se tollasenkaa koodin kirjottaminen helppoa ole...

nomic [14.05.2007 12:10:19]

#

Oikeastaan "kunnollisen" koodin kirjoittaminen on helppoa, kunhan antaa sille aikaa, sen jälkeen se alkaa luonnistua automaattisesti.
Enpä itsekään kovin hyvä koodia kirjoittamaan ole, mutta reilusti kehittyneempää nykyinen tyyli on kuin edellinen, jossa sohellettin ja tehtiin "isoja" ohjelmia ilman suunnittelua.
Siitä päästäänkin siihen, että teit millaisen ohjelman tahansa: AINA ennen koodin kirjoittamista: suunnittele paperille, tai tietokoneelle huolellisesti, että millainen ohjelma on, sen toiminnat, pseudona jotkut koodit jne. Kun suunnitelma on valmis, on se eräänlainen käsikirjoitus, jota seuraat ja näin saat koodista todella puhdasta ja järkevää.

Voisin tänään katsastaa tuon chat-softan ja etsiä siitä ongelmia, jos se auttaisi. :)

nomic [14.05.2007 20:38:25]

#

Muutama purkkaratkaisu:
"1. kun clientit disconnectaa listasta ei häivy kaikki "
-Kun terminoidaan, tai suljetaan akkuna, lähetetään serverille tieto, tyyliin:
socketti.senddata = "destroy_me|nicki"
-serveri vastaanottaa tämän ja lähettää sen kaikille clienteille, jotka on yhdistäneet.
-Clientit käsittelevät tiedon ja käyvät läpi nicklistan ja poistavat sieltä, jos löytää tämän nimisen clientin.

"2. jos servu on täynnä niin clientille tulee suoraan disconnect mutta ei sitä disconnect messagea... "
tähän sopii esim tämmöinen koodi (serveriin):

Private Sub ws_ConnectionRequest(Index As Integer, ByVal requestID As Long)

    socketti(Index).Close
    DoEvents
    socketti(Index).Accept requestID
    Load socketti(socketti.Count) 'joudutaan tehdä uusi socketti, jotta voidaan ilmoittaa, ettei se pääse tänne :<
    socketti(socketti.UBound).LocalPort = meidän käyttämä portti
    socketti(socketti.UBound).Listen
    doevents
    if index => maximi then
      socketti(index).senddata "serveri_msg|Xätti o täynnä!"
      unload socketti(socketti.ubound) 'nuni, nyt ei enään tarvita sitä.
    end if
End Sub

Toimivuudesta en tiedä, sillä tällä koneella nyt ei ole vb:tä, enkä jaksa liikkua, mutta eiköhän nuo esimerkkeinä toimi.

Grez [14.05.2007 23:21:39]

#

Jorgga kirjoitti:

näinhän se on mutta ei se tollasenkaa koodin kirjottaminen helppoa ole...

Luonnollisesti - huonon koodin kirjoittaminen on (kokonaisuuden kannalta ajatellen) vaikeampaa kuin hyvän koodin kirjoittaminen. Hyvän koodin kirjoittaminen tosin edellyttää useimmiten myös hyvää suunnittelua.

_Pete_ [15.05.2007 11:04:33]

#

Grez kirjoitti:

. Hyvän koodin kirjoittaminen tosin edellyttää useimmiten myös hyvää suunnittelua.

Ja siirtymistä aivovamma VB:stä johonkin järkevään alustaan.

Merri [15.05.2007 11:38:39]

#

Ei sentään. VB:llä voi kirjoittaa erinomaista koodia. Huono koodi on 100% ohjelmoijan vika.

Freeze [16.05.2007 07:36:44]

#

_Pete_ kirjoitti:

Ja siirtymistä aivovamma VB:stä johonkin järkevään alustaan.

Lähes paras alusta apu/hyötyohjelmien tekoon windowsille.


Sivun alkuun

Vastaus

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

Tietoa sivustosta