27
Tags:
visual-basic
Skrevet af
Bruger #2353
@ 12.04.2004
Indledning
Denne artikel er en viderebygning på den forrige artikel ”Simpel chat mellem to computere”, men udgangspunktet er denne gang at skrive en mere avanceret chat, der ikke blot fungerer mellem to computere, men fungerer mellem X-antal computere.
Der er et antal nye funktioner som alle bidrager til en meget brugervenlig chat med en simpelt brugergrænseflade. Fx behøves det ikke længere vides hvad de andres ip-adresser er – programmet søger dem selv og opretter forbindelse.
I realiteten kunne du, når du tester dit program komme i kontakt med en anden bruger af programmet, hvis du har forbindelse med Internettet, sjovt ikke?
Vi benytter kun to Winsock-kontroller der begge er af samme format som benyttet i sidste artikel, derfor skal du ikke lære ny kode; men vær forberedt på en sofistikeret kodeopbygning. Der bliver ikke taget brug i API eller lignende så alt forekommer logiske og med pæne danske navne: Fx hedder en Winsock-kontrol: ”skab_forbindelse”.
Programmet
Vi kommer til at bruge to forme og tre moduler i alt. Den ene form skal bruges som brugergrænseflade og den anden kører hele tiden i det skjulte for at skabe forbindelse til andre brugere og for at modtage tekststumper.
Start med at oprette disse, med navnene:
(form1) som ”Start_form”
(form2) som ”Forbindelser”
(module1) som ”Brugere”
(module2) som ”Procedurer”
(module3) som ”Variabler”
Eller saml alle modulerne i ét, hvis du ikke finder overskueligheden relevant, ovenstående anbefales!
Modulet ”Brugere”
Her skriver du understående tekst, der her er kopieret direkte fra projektet – derfor er kommentarerne stadig i koden.
' Indstillinger for hver bruger
Public Type brugereType
Alias As String
ComputerNavn As String
Ip As String
Online As Boolean
TidTilbage As Integer
End Type
' Publiserer dem
Public Bruger(400) As brugereType, BrugerAntal As Integer
Næste modul ”Procedurer” indeholder meget kode, som du kan betragte når du har kopieret den ind i Visual Basic projektet. Der er kommentarere i koden.
Public Function FindesBruger(BrugerNavn As String, Ip As String) As Boolean
' Undersøger hver bruger
For n = 1 To BrugerAntal
' Hvis navnet er det samme
If LCase(Bruger(n).ComputerNavn) = LCase(BrugerNavn) Then
' Hvis ip-adressen er den samme
If Bruger(n).Ip = Ip Then
' Brugeren findes
FindesBruger = True
Exit Function
End If
End If
Next n
End Function
Public Function FindDelAfTekst(temp As String, Which As Integer) As String
' Nulstiller
TekstFra = 1: TekstDele = 0
' Finder hver tekststump i den samlede tekst og deler
' den op i dele.
For n = 1 To Len(temp)
If Mid(temp, n, 1) = "|" Then
TekstDele = TekstDele + 1
TekstDel(TekstDele) = Mid(temp, TekstFra, n - TekstFra)
TekstFra = n + 1
End If
Next n
' Skriver den ønskede del til brugeren
FindDelAfTekst = TekstDel(Which)
End Function
Public Function FindBrugerensNummer(Brugername As String, Ip As String) As Integer
' Denne procedure er meget ens med "FindesBruger"
For n = 1 To BrugerAntal
If LCase(Bruger(n).ComputerNavn) = LCase(Brugername) Then
If Bruger(n).Ip = Ip Then
' Brugeren er fundet
FindBrugerensNummer = n
Exit Function
End If
End If
Next n
End Function
Public Sub Opdater()
' Denne sub aktiveres hver gang bruger ændrer status,
' eller når nye brugere kommer til.
' Det foregår på startformen
With Start_form
' "Gør ren"
.BrugerList.Clear
' Tilføj hver bruger:
Dim AddTekst As String
For n = 1 To BrugerAntal
' Nulstil
AddTekst = ""
' Hvis brugeren er sig selv
If Bruger(n).Ip = Forbindelser.Skab_forbindelse.LocalIP Then
AddTekst = " (dig)"
End If
' Tilføj til listen
.BrugerList.AddItem Bruger(n).Alias & AddTekst
Next n
End With
End Sub
Public Sub SletBruger(ByVal Hvilken As Integer)
' Slet en bruger fra listen
For n = Hvilken To BrugerAntal - 1
Bruger(n).Alias = Bruger(n + 1).Alias
Bruger(n).ComputerNavn = Bruger(n + 1).ComputerNavn
Bruger(n).Ip = Bruger(n + 1).Ip
Bruger(n).Online = Bruger(n + 1).Online
Bruger(n).TidTilbage = Bruger(n + 1).TidTilbage
Next n
BrugerAntal = BrugerAntal - 1
End Sub
Public Sub SendBesked(Besked As String, ByVal Til_hvem As Integer)
' Angiver hvem der skal skrives til
Forbindelser.Skriv.RemoteHost = Bruger(Til_hvem).Ip
' Sender beskeden
Forbindelser.Skriv.SendData Besked
End Sub
Public Sub SendTilAlle(Besked As String)
For n = 1 To BrugerAntal
' Send til hver bruger
SendBesked Besked, n
Next n
End Sub
I sidste modul, ”Variabler”, er der blot én linje, men af hensyn til eventuelle opdateringer eller supplementer anbefales det at du beholder koden i ét modul.
' Variabler til analyse af sendte tekster
Public TekstDel(30) As String, TekstFra, TekstDele As Integer
Nu er det grundlæggende sat på plads, og vi kan gå i gang med at kode noget i Winsock-kontrollerne og knapperne. Jeg vil dog råde dig til at læse kommentarerne allerede nu og forstå koden, men du kan også vente til de bliver aktiveret.
Startformen
Formen ”Start_Form” skal vi nu i gang med at designe. Sæt det eventuelt op som du kan se på billedet her under, og navngiv kontrollerne som vist:
Dobbeltklik på formen og vælg ”(generel)” hvor der står ”(form)”. Nu kan du copy-paste denne kode:
Private Sub BrugerList_Click()
' Aktiver knapperne
Command2.Caption = "Skift " & Bruger((BrugerList.ListIndex + 1)).Alias & "'s brugernavn"
Command2.Enabled = True
Command4.Enabled = True
End Sub
Private Sub Command1_Click()
' Sender beskeden til alle brugere
SendTilAlle "chatbesked|" & Text2.Text & "|" & Forbindelser.Skab_forbindelse.LocalHostName & "|"
' {Bemærk at den besked der skal sendes er delt op}
' {med "|". Det gøres for at modtageren kan dele}
' {den op i:}
' (1) typen at modtage
' (2) indholdet
' (3) hvem der sender
' Nulstiller
Text2.Text = ""
End Sub
Private Sub Command2_Click()
' Skift alias
Dim NytNavn As String
With Bruger((BrugerList.ListIndex + 1))
NytNavn = InputBox("Skift alias på brugeren: " & .Alias & " der har computernavnet: " & .ComputerNavn & ":", "Skift brugernavn", .Alias)
If NytNavn <> "" Then
.Alias = NytNavn
End If
Opdater
End With
End Sub
Private Sub Command3_Click()
Opdater
End Sub
Private Sub Command4_Click()
MsgBox "For at vise mulighederne med opdelningen af sendte beskeder, vises det her, hvor let det er at skabe dynamik.", vbInformation
' For at vise det forkellige fordele ved at
' anvende tekstdelningen er dette eksempel
' godt.
' Send til en bruger
SendBesked "test|", BrugerList.ListIndex + 1
End Sub
Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
' 13 er enter
If KeyCode = 13 Then
Command1_Click
End If
End Sub
Det er den grundlæggende kode, men det første der skal ske i programmet er, at Winsock-kontrollerne skal aktiveres. Vi har endnu ikke oprettet nogle Winsock-kontroller, men det skal vi til nu.
Dobbeltklik på formen ”Forbindelser” og opret følende kontroller, så det ser ud som understående: (I forrige artikel beskrives det hvordan Winsock-kontrollen findes)
Sæt intervallet for Timer1 til ”500” og intervallet i timer2 til ”1000”.
Nu kan du på samme måde som før kopiere den næste kode ind i formen:
Private Sub Skab_Forbindelse_DataArrival(ByVal bytesTotal As Long)
' Hvis der skulle ske fejl
On Error Resume Next
' Her modtages nye brugere
' ************************
' Modtag den sendte tekst
Dim temp As String
Skab_forbindelse.GetData temp
' For at modtage beskeder kun forudbestemt til dette program
' ender hver sendt tekst på "|", det giver også andre fordele
' som er beskrevet i forklaringen af dette program.
If Right(temp, 1) = "|" Then
' Undersøg om brugeren allerede eksisterer
If FindesBruger(FindDelAfTekst(temp, 1), FindDelAfTekst(temp, 2)) = True Then
' {I denne del af IF-funktionen fortæller koden at}
' {den angivne bruger en online.}
' {***********************************************}
' [Brugeren findes allerede]
Dim BrugerNummer As Integer
BrugerNummer = FindBrugerensNummer(FindDelAfTekst(temp, 1), FindDelAfTekst(temp, 2))
' [Hvis han er offline i forvejen skal der opdateres]
If Bruger(BrugerNummer).Online = False Then: Opdater
' [Sæt ham til "online"]
Bruger(BrugerNummer).Online = True
' [Giver brugeren tid til at være online]
Bruger(BrugerNummer).TidTilbage = 2
Else
' [Det er en ny bruger]
BrugerAntal = BrugerAntal + 1
Bruger(BrugerAntal).ComputerNavn = FindDelAfTekst(temp, 1)
Bruger(BrugerAntal).Alias = FindDelAfTekst(temp, 1)
Bruger(BrugerAntal).Ip = FindDelAfTekst(temp, 2)
' [Giver brugeren tid til at være online]
Bruger(BrugerAntal).TidTilbage = 2
' [Opdater]
Opdater
End If
End If
End Sub
Private Sub Skriv_DataArrival(ByVal bytesTotal As Long)
' Modtage skrevne tekster
Dim temp As String
Skriv.GetData temp
' Analyser hvilken slags det er
Dim Nr As Integer
Select Case FindDelAfTekst(temp, 1)
Case "chatbesked" ' Modtag chatbeskeder
' Beskeden
Dim Besked As String
Besked = FindDelAfTekst(temp, 2)
' Finder ud af hvem brugeren der har
' sendt beskeden er.
Dim BrugerNummer As Integer
BrugerNummer = FindBrugerensNummer(FindDelAfTekst(temp, 3), Skriv.RemoteHostIP)
' Flytter teksten
Dim SkrevneBeskeder As String
SkrevneBeskeder = Start_form.Text1.Text
' Skriver den nye beksed
Start_form.Text1.Text = "(" & Bruger(BrugerNummer).Alias & "): " & Besked
' Tilføjer den gamle besked
Start_form.Text1.Text = Start_form.Text1.Text & vbCrLf & SkrevneBeskeder
Case "test" ' Modtag andre bekseder (test)
Dim Farve As Integer
Farve = 200 + Int(Rnd * 55)
Start_form.Text1.BackColor = RGB(Farve, Farve, 100)
Start_form.Text2.BackColor = Start_form.Text1.BackColor
Start_form.BrugerList.BackColor = Start_form.Text1.BackColor
' Her kunne der fortsætte et utal af funktioner specificeret
' til hver enkelt bruger.
End Select
End Sub
Private Sub Timer1_Timer()
' Brugeren sender til andre, at han er klar
' til at chatte.
' Beskeden vil se således ud:
' Computernavn|ip|
' Det gør det muligt for modtageren at dele
' teksten op i to dele:
' Computernavn
' Ip
' Send:
Skab_forbindelse.SendData Skab_forbindelse.LocalHostName & "|" & Skab_forbindelse.LocalIP & "|"
End Sub
Private Sub Timer2_Timer()
' {denne timer tæller hver brugers tid ned og når}
' {variablen er under 0 konkluderes det, at brugeren}
' {ikke er online mere, da hver bruger sender en besked}
' {til de andre hvert halve sekund.}
For n = 1 To BrugerAntal
' [Tilføjer egen bruger tid for at blive online]
If Bruger(n).Ip = Forbindelser.Skab_forbindelse.LocalIP Then
Bruger(n).TidTilbage = 10
End If
' [Tæl ned]
Bruger(n).TidTilbage = Bruger(n).TidTilbage - 1
' [Hvis brugerens tid er under 0]
If Bruger(n).TidTilbage < 0 Then
' [Han konkluderes offline]
If Bruger(n).Online = True Then
' [Han sættes til offline]
Bruger(n).Online = False
' [Fjerner muligheden for at skifte navn]
Start_form.Command2.Enabled = False
Start_form.Command4.Enabled = False
' Delete from the list to
SletBruger n
' [Opdater]
Opdater
End If
End If
Next n
End Sub
Men vi mangler det vigtigste! Vi skal skabe forbindelse til Winsock-kontrollerne og det skal gøres i starten – helt i starten. Derfor skal du nu åbne ”Start_form” og sætte følende kode ind i Form_load:
' Skaber forbindelser
' [Alle winsock-kontroller befinder sig på formen: "forbindelser"]
Load Forbindelser
' [* * Skaber forbindelse til andre * *]
With Forbindelser.Skab_forbindelse
' (lukker for ikke at skabe konflikter)
.Close
.Protocol = sckUDPProtocol
' (bruger port 80)
.LocalPort = 80
.RemotePort = 80
' (denne ip-adresse kan bruges til at åbne forbindelser)
.RemoteHost = "255.255.255.255"
' (forbinder til porten)
.Bind 80, .LocalIP
End With
' [Skriver navnet på den lokale computer]
Label2.Caption = "Velkommen " & Forbindelser.Skab_forbindelse.LocalHostName
' [* * Gør det muligt at skrive med andre * *]
With Forbindelser.Skriv
.Close
.Protocol = sckUDPProtocol
' (bruger port 81)
.LocalPort = 81
.RemotePort = 81
.Bind
End With
Sammenfatning
Det var sidste linje kode i dette program, og det er nu klart til at blive testet. Det virker mellem 1 og 400 computere, og du kan forøge dette antal ved at ændre på antallet i modulet: ”Brugere”. Faktisk kan du næsten ændre det ud i det uendelige.
Hvis du har en Internetforbindelse kan du skrive med andre ude i verden. Programmet virker også over LAN-forbindelser.
Alt i alt håber jeg, at du kan bruge koden og programmet til at videreudvikle egne idéer. Det vil fx ikke være noget problem at bruge grundkonceptet til at lave spil eller mere avancerede chatte.
Det tog mig ca. 1½ time at skrive programmet, men med det taget i forbehold, at jeg genbrugte gammel kode. Du kan let genbruge min kode i dine egne programmer.
Hvis du ønsker down- og uploadfunktioner kan du hente min ”RecieveFile” og ”SendFile” ActiveX-kontroller kan du hente dem her, sammen med dette program:
http://www.udvikleren.dk/articlefiles/2353/chatprogram.ziphttp://www.udvikleren.dk/articlefiles/2353/send_og_modtag_filer.zipGod fornøjelse.
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (26)
en god artikel.. med et emne der også har underet mig !
ehm jeg ved ik lige hvad jeg gør forkert... jeg er max noob og får fejl.... 424 object requiret.
Load Forbindelser
Det er uden tvivl fordi, du ikke har givet en af kontrollerne på formen det rette navn. Prøv at revidere artiklen mere detaljeret.
Mvh. Rasmus
Hej Rasmus.
Jeg har nu læst din artikel og gennemprøvet programmet. Ændret lidt osv.
Plus til artiklen :
Den er rimelig godt beskrevet.
Man får en del at vide.
Og det bedste man får jo lyst til at lave mere af denne her slags, meget mere
Minus :
Der er lidt småfejl i koden. Du mangler feks. at skrive noget om label2. Den skal man jo have med, nu du bruger den i din kode, til at vise brugerens navn.
Man kunne godt uddybe emnerne noget mere, så man kunne bruge tingene til endnu mere.
Men alt i alt, en god artikel, som ikke mindst har sat en del ting igang, der skal prøves af.
Fortsæt det gode arbejde.
bliver ved med at få en fejl med noget: List Index
St!cks>> Tak for kommentaren..
Andi Rosenhave>> Har du prøvet at downloade programmet? Det kunne være en lille fejl i copy-past proceduren.
Super Artikel!
For ca. 3 timer siden, var jeg 100% n00b i VB, så har jeg læst lidt, og så kunne jeg lave begge chat programmerne!
Håber da at du bliver ved med at lave sådanne ting...
Det næste trin, ville nok være at du lavede, 1 application til chat server med DB over brugere, og så en klient program til at oprette brugere og sådan noget med... ( Bare en drøm jeg har :-D )
Hej jeg kan ikke få send og modtag til at virke! Den siger error duing load og at der mangler en eller anden fil. Så jeg kan ikke åbene den!! øv
Fint program..... har et problem?
Run-time error '40006'
Wrong protocol or connection state for the requested trensaction or request
?? mail: strangecap@hotmail.com
jeg får stadig Fejl ved Load forbindelser. Også ved den jeg har downloadet...
Mega god artikel ...
Bruger den til at lave net spil med over den , har bare et par problemer med nogle ad koderne men tror det kommer snart...
jeg har problem når den ska loade sig den : Run time Error 10048 Adress in use
Sub or function not defined:
"finddelaftekst"
Hej.
Jeg får run-time error 126. (Ingen beskrivelse).
Ved debug siger den at fejlen ligger ved .Bind
' [* * Skaber forbindelse til andre * *]
With Forbindelser.Skab_forbindelse
' (lukker for ikke at skabe konflikter)
.Close
.Protocol = sckUDPProtocol
' (bruger port 80)
.LocalPort = 80
.RemotePort = 80
' (denne ip-adresse kan bruges til at åbne forbindelser)
.RemoteHost = "255.255.255.255"
' (forbinder til porten)
.Bind 80, .LocalIP '/////// .LocalIP siger den er fejlen!
End With
hej jeg er meganoob til vb men jeg synes stadig jeg får for mange fejl:91 og jeg har fulgt det hele til punkt og prikke
jeg bruger Microsoft Visual Basic 2005 express edition...
og så er der det jeg kan ikke finde de der winsock kontrol
jeg har set den anden artikel med simpel chat
kan du hjælpe mig?
Jeg får en Run-time error 424
Object requred
i Label2.Caption = "Velkommmen " & Forbindelser.Skab_Forbindelse.LocalHostName
Hvordan kan det være???
hvilken version af visual basis er bedst?
Visual Basic*
Den nyeste
hey
hvordan finder man det der Module
og hvad hedder det inde i vb 6,0
Jeg får flere fejl i den
jeg prøver at gå den igennem igen
Gutter det er fordi, at denne artikel er relativ gammel og ikke er skrevet i NET. Visual Basic 2005 samt express edition er bygget på .NET - som i øvrigt bliver mere og mere udbredt - så for at lave denne her chat, skal i (hvis man stadig kan) lede efter en ældre version af Visual Basic, som ikke bruger .NET.....
Det virker ikke der er 7 fejl i module1 når jeg indtaster koden til module1, nogen der kan hjælpe?
Hejsa. jeg får ingen problemer ved at køre exe filen på en computer der har VB installeret, men hvis man kører den andre steder så siger den at den mangler filen MSWINSCK.OCX
Hvad gør jeg ?
har fundet fejlen . . skulle bare ligge den manglende fil i samme mappe som exe filen, på de computere der ikke undersøtter det. . . smart program.
Hvordan finder man winsock i Visual Studio 2008 ?
heey Rasmus.
Jeg kan simplethen ikke finde den grundliggende ting winsock.
ved du hvor den kan downloards henne
eller vil du sende den til mig.
har en acer aspire one.( notebook)
med windows xp home editon
hvis det kan hjælpe
Håber sgu du vil hjælpe mig da det lige sagen det med egen chat.
MVH
kenneth k
Du skal være
logget ind for at skrive en kommentar.