tcp/ip keskustelu monelle: serveri lataa aina uuden Winsockin joka clienttiä varten ja näin voi useampi sätata. Sen verran nopeasti tehty että parantamisen varaa on mutta tämähän on vain vinkki joita pitääkin soveltaa... ja en tehnyt tätä nyt vaan kauan sitten esimerkiksi kai zalamanderille ja laitoin tämän koska tuolla https://www.ohjelmointiputka.net/koodivinkit/24142-vb6-tcp-ip-keskustelu pyydettiin... :P
koko säätö löytyy osoitteesta http://sooda.dy.fi/foo/ws.zip. parempi ladata tuolta koska tässä on niin paljon commandbuttoneita ym... no kuitenkin jos haluat vain copypastettaa tuon listauksen niin luo formille(objekti:nimi):
commandbutton: clientiks
commandbutton: s
textbox: osoote
label: servutieto
label: label1
textbox: portti
commandbutton: senddddd
textbox: moikka
winsock:ws
OHOH, tossa oli virhe tossa minkä voi ladata. Korjattiin.
'WinSock monikäyttö esimerkki juttu
'ja hieno sellanen
'ja hieno
'voi käyttää monta tyyppiä samaan aikaan
'by: sooda (konstah@hotmail.com)
Private tyyppi
Private Sub clientiks_Click()
ws(0).Close 'suletaan
DoEvents 'annetaan sen sulkeutua
ws(0).Connect osoote.Text, portti.Text 'ja yhdistellään
tyyppi = "clientti"
End Sub
Private Sub Form_Load()
'osote meijjän osotteeks
osoote.Text = ws(0).LocalHostName
End Sub
Private Sub s_Click()
ws(0).Close 'sule ettei tuu erooria
For i = 1 To ws.UBound
ws(i).Close
Unload ws(i) 'irrotetaan vanhat wössit, tää on helpointa
DoEvents
Next
ws(0).LocalPort = portti.Text 'portti
ws(0).Listen 'ja kuunnellaan yhdistyksiä...
servutieto.Visible = True
servutieto.Caption = "Odotellaan yhteyksiä..."
tyyppi = "servu"
End Sub
Private Sub senddddd_Click()
If tyyppi = "" Then MsgBox "Yhistä eka": Exit Sub
If tyyppi = "clientti" Then
ws(0).SendData moikka.Text 'clientillä on vaan 1ksi kple wössejä
Else
For i = 0 To ws.UBound
If ws(i).State = sckConnected Then 'jos yhdistetty niin lähetä
ws(i).SendData moikka.Text
End If
Next
End If
End Sub
Private Sub ws_Close(Index As Integer)
DoEvents 'muuten vaan
'ja kerrotaan että pois
If tyyppi = "clientti" Then
MsgBox "Oho, servu sulki yhteyden... :("
Else
MsgBox "Soketti #" & Index & " sulkeutui.", vbInformation, "Wössi-Inhvo"
End If
End Sub
Private Sub ws_Connect(Index As Integer)
DoEvents 'annetaan sen yhdistää
'ja ilmotellaan
MsgBox "Saatiin yhteys kohteeseen " & ws(Index).RemoteHost & ".", vbInformation, "Wössi-Inhvo"
End Sub
Private Sub ws_ConnectionRequest(Index As Integer, ByVal requestID As Long)
ws(Index).Close 'suljetaan se, kuuntelutilassa ei voida ottaa yhteyksiä
DoEvents 'ja annetaan sen sulkeutua
ws(Index).Accept requestID ' otetaan yhteys
Load ws(ws.Count) 'tehdään uusi wössi (taikuutta!)
ws(ws.UBound).LocalPort = portti.Text 'setataan sen portti
ws(ws.UBound).Listen 'ja kuunnellaan sillä
MsgBox "Oho, mehän ollaan ihan julkkiksia! Sokettiin #" & Index & _
" yhdistää joku pälli id:llä " & requestID & " .", vbInformation, "Wössi-Inhvo"
servutieto.Caption = "Soketteja yht. " & ws.Count
End Sub
Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
ws(Index).GetData tieto, vbString
MsgBox "Soketilta #" & Index & " tuli dataa " & bytesTotal & " tavua: " & vbCrLf & tieto
End Sub
Private Sub ws_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'virhe!!!
MsgBox "Soketilla #" & Index & "kävi virhe #" & Number & ": " _
& Description, vbInformation, "Soketti erhe!!!"
End Sub
Private Sub ws_SendComplete(Index As Integer)
MsgBox "Oke, soketti #" & Index & " lähetti datat onnistuneesti.", vbInformation, "Wössi-Inhvo"
End Sub'ja hieno sellanen
'ja hieno
senddddd_Click()
noi pisti vähän silmään :P
Emmä muuta tiiä ku, että tuli tarpeeseen :)
Mut hei... mistä ton winsockin saa(VB5)?
Ei ku jaa kato löysin sittenki :)
kun latasin ton valmiin niin se valitti jotain tosta "ws" ja jotakin muuta !
mitä se valitti? ei mulla...
sooda voitko lähettää sen zip tiedostona mun sähkö postiin ?
Osote: make3003@hotmail.com
kiits :)
jahas, mulla vinkuu ws subist... ;CC
mistä subista?
OHO! Nyt pitäisi toimia ton ws:n. Kokeilkaa, ite en voi(vb5cce ei tykkää winsockista(license info for this component not found :( ))
Oli siis niin että sitä ws:ää ei ollut siinä :D mun vb jotenki sekoili sen kanssa.
kätevä pikku juttu
MUTTA MITES SEN SAA TOIMIMAAAN??????????????????????????????!!!!!!!!!!!?!?!
en tiiä mistä johtuu toi muistin loppuminen... joku bufferi siinä täyttyy kun se yhdistelee niin nopeasti, enpäs tiiä.
Miksei se toinen raukka saa mitään tekstiä ellei servu lähetä sitä?
Eipäs kuulukaan, tämä on vain vinkki eikä valmis sätti :)
Noh jos haluat että clientin sendimä teksti näkyy kaikille niin yksinkertaisesti sanot servulle että lähetä se muillekin! :) noh tunge ws_dataarrivaliin viimeiseksi:
If tyyppi = "servu" Then
For i = 0 To ws.UBound
If ws(i).State = sckConnected Then 'jos yhdistetty niin lähetä
ws(i).SendData tieto
End If
Next
End IfIsommissa rojekteissa toi senditys kannattaa pistää omaksi subikseen.
sooda kirjoitti:
en tiiä mistä johtuu toi muistin loppuminen... joku bufferi siinä täyttyy kun se yhdistelee niin nopeasti, enpäs tiiä.
Tietokoneen muisti loppuu sen takia, koska se sulkee ne socketit muttei se ohjelma poista niitä koneen muistista sillä Unload ws(i) -komennolla.
Ite tein sellaisen, mutta sitten kun se yritti avata uutta sockettia siihen samaan niin se sanoi, että se kohde on jo valmiiksi ladattu, joten se ei toiminut se Unload tai sitten tapahtui jotain muuta ARSEtta :D
sen saa toimimaan ku etsii koneeseen sellasen ocx ku WINSOCK.ocx pitäis toimia mut täs on vaan sellanen ongelma et kaikilla on nykyään palomuuri eikä tää ohjelma toimi sen läpi et onko mahollista tehä tohon esim firewall killeri tai joku se ois aika kätevä ottaen esimerkkiä messengeristä ;D
lainaus:
sen saa toimimaan ku etsii koneeseen sellasen ocx ku WINSOCK.ocx pitäis toimia mut täs on vaan sellanen ongelma et kaikilla on nykyään palomuuri eikä tää ohjelma toimi sen läpi et onko mahollista tehä tohon esim firewall killeri tai joku se ois aika kätevä ottaen esimerkkiä messengeristä ;D
mswinsck.ocx se yleensä on. Mitään "firewall killeriä" ei voi tehdä, ja mesessä ei ole sellaista. Mistä tollaisen käsityksen oot saanu? :P
keskustelijalista ja ja yksityisviestit ois hyvä lisä...
lainaus:
keskustelijalista ja ja yksityisviestit ois hyvä lisä...
Päh, tää on vain runko eikä valmis chatti. Tee ite :)
Sooda muuten.
Minulla toi kohta tuosta
Private Sub Form_Load()
'osote meijjän osotteeks
osoote.Text = ws(0).LocalHostName
End SubNiin tuossa, siis minnunen osoite tohon laitetaan, kun mulla se värjää ton localhostnamen kun koitan käynistää
Mikä on vikana?
Voiko olla mahdollista, että minulta puuttuu koko ws?
project ----> component valikosta sitä löytynyt.
nipasenmaki: kyl se sit varmaan puuttuu. mikä vb:n versio btw?
Valmispaketin auki revin. Valmiin client-esimerkin olin jostain muualta hakenut ja sillä yhdistin. Kun clientin suljin, rupes tämä koodi servuna looppaamaan erroria clientin poistumisesta, eikä loppunu ennen kun koko VB:n sulin.
Fiksailin yksinkertaisesti muuntamalla else:n elseif:ksi ja ehdoiks tyyppi="servu" and toisto=0, lisäsin ehdon alle vielä tehtävän "toisto=toisto+1" ja luonnollisesti määritin toiston integeriks.
Kääntyy muuten aika hyvin VB.NET:lle sen omilla työkaluilla, tosin koodi ei ole enää parhaimmillaan sen jälkeen.
pitikin ihan luoda acountti tätä varten :P
tosiaan, kolmatta päivää nyt kirjoittelen tavaraa visual basicilla, ja tottakai oma chat clientti ekana hommana ettei mene liian helpoksi koko touhu =)
ainoana vastaantulevana ongelmana oli tosin juuri tuo että kun teksti ei tule kun serveriin asti, enkä keksinyt että millä sen sa kulkemaan muillekkin asti
tein muuten tuohon nimimerkkisysteemin joka toimii ainakin kahden ihmisen keskusteluissa moitteetta :)
eli yksinkertaisimmillaan lisää vaan formiin 1 kappale textboxeja jonka nimi on "nick"
ja sitten muuta seuraavat kohdat koodista
Private Sub senddddd_Click()
If tyyppi = "" Then MsgBox "Connect first": Exit Sub
If tyyppi = "clientti" Then
WS(0).SendData "(" & nick.Text & ") " & moikka.Text 'clientillä on vaan 1ksi kple wössejä
Let msg.Text = msg.Text & vbCrLf & "(" & nick.Text & ") " & moikka.Text
Else
For i = 0 To WS.UBound
If WS(i).State = sckConnected Then 'jos yhdistetty niin lähetä
WS(i).SendData "(" & nick.Text & ") " & moikka.Text
Let msg.Text = msg.Text & vbCrLf & "(" & nick.Text & ") " & moikka.Text
End If
Next
End If
End Subtässä tosiaan sitten olen muuttanut tuon "msg" textboxin multi-line tyyppiseksi jotta logit säilyisivät
jos nyt joku ihmetteli tuota
Let msg.Text = msg.Text & vbCrLf & "(" & nick.Text & ") " & moikka.Text
Tämä on mielestäni tosi hyvin tehty ja käytän tämän oppeja tulevaisuudessa!
Aihe on jo aika vanha, joten et voi enää vastata siihen.