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)
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".
jaahas no upin omalle palvelimelle sitten... linkki: http://koti.mbnet.fi/jorgga/chat.zip
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ä.
näinhän se on mutta ei se tollasenkaa koodin kirjottaminen helppoa ole...
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. :)
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.
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.
Grez kirjoitti:
. Hyvän koodin kirjoittaminen tosin edellyttää useimmiten myös hyvää suunnittelua.
Ja siirtymistä aivovamma VB:stä johonkin järkevään alustaan.
Ei sentään. VB:llä voi kirjoittaa erinomaista koodia. Huono koodi on 100% ohjelmoijan vika.
_Pete_ kirjoitti:
Ja siirtymistä aivovamma VB:stä johonkin järkevään alustaan.
Lähes paras alusta apu/hyötyohjelmien tekoon windowsille.
Aihe on jo aika vanha, joten et voi enää vastata siihen.