Bygg ett klient/server baserat chat system med winsock.ocx
Förord
I den här kursen ska vi skapa ett server/klient-baserat chat system, d v s vi ska ha ett server-program och ett klient-program. Servern skall hålla reda på vilka som är anslutna och skicka vidare alla inkomna meddelanden till alla användare. Klienten skall skicka meddelanden till servern och ta emot andra från den.Innehåll
»»
»
»
Server programmet
Börja med ett nytt projekt. Lägg till en socket. Döp den till 'Socket' och sätt Index till 0. Lägg till två textboxar, txtLog och txtShout. På txtLog sätter du MultiLine och Locked till True och ScrollBars till '2 - Vertical'. txtShout behöver du inte ändra på.
Option Explicit
' Lagrar det portnummer som servern ska lyssna på/klienten ska ansluta till
Const Port = 1946
Private Sub Form_Load()
' Visa det lokala IP-numret i titelraden
Me.Caption = "WinSock Chat Server - " & Socket(0).LocalIP
' Inställningar för vår första socket
With Socket(0)
' Sätt portnummer och börja lyssna
.LocalPort = Port
.Listen
End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim Client As Integer
' Loopa igenom alla sockets och stäng anslutningarna
For Client = 0 To Socket.UBound
Socket(Client).Close
Next Client
End Sub
' Den här rutinen lägger till text i logg-rutan och sätter markeringen sist i
' texten så att man alltid ser den senaste delen av loggen
Private Sub AddText(Text As String)
txtLog = txtLog & Text & vbCrLf
txtLog.SelStart = Len(txtLog)
End Sub
' När man trycker på enter i meddelande-rutan så sickas texten till klienterna
Private Sub txtShout_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
' Skicka meddelandet, användarnamnet är 'Server'
Shout txtShout, "Server"
' Töm textrutan
txtShout = ""
' Ignorera knapptryckningen
KeyAscii = 0
End If
End Sub
' Skickar meddelandet till alla anslutna klienter
Private Sub Shout(Text As String, User As String)
Dim Client As Integer
For Client = 0 To Socket.UBound
' Skicka bara om socketen är ansluten
If Socket(Client).State = sckConnected Then
Socket(Client).SendData User & ": " & Text
DoEvents
End If
Next Client
End Sub
' ConnectionRequest sker när en klient försöker ansluta
Private Sub Socket_ConnectionRequest(Index As Integer, ByVal requestID As Long)
With Socket(Index)
' Sluta lyssna
.Close
' Acceptera användaren och låt henne ansluta
.Accept requestID
End With
' Ladda en ny socket och lyssna
Load Socket(Socket.UBound + 1)
With Socket(Socket.UBound)
.LocalPort = Port
.Listen
End With
End Sub
' Inkommande data
Private Sub Socket_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim data As String
' Läs in den inkommande datan i strängen data
Socket(Index).GetData data, vbString
' Om det första tecknet är ASCII 20 så är det ett kommando, inte ett meddelande
If Asc(Left(data, 1)) = 20 Then
' Alla kommandon är 4 tecken långa
Select Case Mid(data, 2, 4)
' Klienten vill ange/byta användarnamn
Case "USER"
' Spara användarnamnet i socketens .Tag så är den lättåtkomlig
Socket(Index).Tag = Mid(data, 7)
' Klienten vill avsluta
Case "QUIT"
' Bryt anslutningen
Socket(Index).Close
' Ignorera alla andra kommandon
Case Else
End Select
' Det var inte ett kommando, med andra ord var det text
Else
' Skicka texten till alla anslutna klienter
Shout data, Socket(Index).Tag
End If
' Lägg till datan och 'avsändaren' i loggen
AddText Socket(Index).Tag & ": " & data
End With
End Sub
Klient programmet
Börja med ett nytt projekt. Lägg till en socket. Döp den till 'Socket'. Lägg till två textboxar, txtLog och txtShout. På txtLog sätter du MultiLine och Locked till True och ScrollBars till '2 - Vertical'. txtShout behöver du inte ändra på.
Option Explicit
' En variabel för användarnamnet
Dim UserName As String
' Konstanter för servern som vi ska ansluta till
Const Server = "localhost" ' Namn eller IP-numer. Vi kan lika gärna skriva 127.0.0.1.
Const Port = 1946
Private Sub Form_Load()
' Fråga efter användarnamn
UserName = InputBox("Your username", "Username", "User")
' Visa det lokala IP-numret i titelraden
Me.Caption = Me.Caption & " - " & Socket.LocalIP
' Gör inställningar på socketen och anslut
With Socket
.RemoteHost = Server
.RemotePort = Port
.Connect
End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
' Om vi är anslutna, skicka nedkopplings kommandot till servern
If Socket.State = sckConnected Then Socket.SendData Chr(20) & "QUIT"
DoEvents
End Sub
' Den här rutinen lägger till text i logg-rutan och sätter markeringen sist i
' texten så att man alltid ser den senaste delen av loggen
Private Sub AddText(Text As String)
txtLog = txtLog & Text & vbCrLf
txtLog.SelStart = Len(txtLog)
End Sub
' När man trycker på enter i meddelande-rutan så sickas texten till servern
Private Sub txtShout_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
' Skicka meddelandet
Socket.SendData txtShout
' Töm textrutan
txtShout = ""
' Ignorera knapptryckningen
KeyAscii = 0
End If
End Sub
' Servern kopplade ner oss
Private Sub Socket_Close()
' Visa i loggen
AddText "Disconnected"
End Sub
' Uppkopplingen mot servern är klar
Private Sub Socket_Connect()
' Visa i loggen
AddText "Connected"
' Skicka vårt användarnamn
Socket.SendData Chr(20) & "USER " & UserName
End Sub
' Inkommande data
Private Sub Socket_DataArrival(ByVal bytesTotal As Long)
Dim data As String
' Läs in den inkommande datan i strängen data
Socket.GetData data, vbString
' Visa i loggen
AddText data
End Sub
Summering
Nu är det klart! Kompilera både serven och klienten. Nu är det bara att starta en server och x antal klienter och chatta med dig själv!Det här är en fullt fungerande stomme till ett chat-program, men det är fortfarande mycket som måste fixas. T.ex så borde man kunna 'kicka' användare från servern. Man borde också kunna bestämma vem/vilka som ska se meddelandet. En annan kul grej kunde vara om man kunde se vilka som har loggat på, ungefär som i ICQ. Vidare så kunde man göra en web-baserad klient i t ex ASP eller Perl.
0 Kommentarer