Public Sub UpdateState()
' Visar status på winsock kontrollen
Dim Msg
Select Case Winsock1.State
Case sckClosed: Msg = "Stängd"
Case sckOpen: Msg = "Öppen"
Case sckListening: Msg = "Lyssnar på anrop"
Case sckConnectionPending: Msg = "Anslutning pågår"
Case sckResolvingHost: Msg = "Söker host"
Case sckHostResolved: Msg = "Host funnen"
Case sckConnecting: Msg = "Ansluter till.."
Case sckConnected: Msg = "Ansluten"
Case sckClosing: Msg = "Peer stänger anslutningen"
Case sckError: Msg = "Error"
End Select
Me.Caption = "Winsock Chat : " & Msg
End Sub
Private Sub Winsock1_Error(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)
UpdateState
End Sub
Private Sub Winsock1_SendComplete()
UpdateState
End Sub
Private Sub Winsock1_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
UpdateState
End Sub
Private Sub Form_Load()
UpdateState
End Sub
Private Sub Winsock1_Connect()
UpdateState
End Sub
Nu skall vi använda lite kod för att berätta för programmet att det skall lyssna efter en anslutande begäran.
Private Sub cmdListen_Click()
' Vi fortsätter bara om porten är stängd
If Winsock1.State = sckClosed Then
' Specificera portar att kommunicera med om
' du är server- som alltid använder Port A.
Winsock1.LocalPort = PORTA
' Den andra ändan är Port B
Winsock1.RemotePort = PORTB
' Lyssna efter en anslutning
Winsock1.Listen
End If
UpdateState
End Sub
I denna rutinen skall vi sända en förfrågan till anslutningen
Private Sub txtIP_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
' Om Enter är tryckt, och porten är stängd. Då försöker vi
' att koppla upp igen
If Winsock1.State = sckClosed Then
' Du är ansluten, så använd port B
Winsock1.LocalPort = PORTB
' Andra ändan är server, då är den port A
Winsock1.RemotePort = PORTA
' Anslut
Winsock1.Connect txtIP.Text
End If
' Ta ingen hänsyn till Enter-tangenten
KeyAscii = 0
End If
' du anslöts (och är INTE server) sätt då denna flaggan
bConnected = True
UpdateState
End Sub
Nu behöver vi en rutin som hanterar information när den kommer
från den andra datorn:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
' Om en anslutning begärts, stäng din port och acceptera
' anslutningen
Winsock1.Close
Winsock1.Accept requestID
UpdateState
End Sub
Nu när 2 program är anslutna, behöver vi en funktion så vi kan tala
med varandra.
Private Sub txtSend_KeyPress(KeyAscii As Integer)
'Om Enter trycks och du är ansluten, så sänder
' vi den skrivna texten
If KeyAscii = vbKeyReturn And Winsock1.State = sckConnected Then
' Skicka ett "T" som första tecken för att denna texten som skickas
' sänder användarnamnet och meddelandet, som avslutas med det
' tecken som vi bestämt som terminering.
Winsock1.SendData "T" & txtName.Text & ": " & txtSend.Text & TERCHAR
'Addera texten du skrev i textboxen
txtDialog.Text = txtDialog.Text & txtName.Text & ": " & txtSend.Text & vbCrLf
' Rensa textboxen
txtSend.Text = ""
' Ignorera enter tangenten
KeyAscii = 0
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
' Här kommer text som skickats från den andra datorns program
' sData är strängen, sSingleLine är ett kommando
Dim sData As String
Dim sSingleLine As String
' Ta datat som kommer och lagra i sData som en sträng
Winsock1.GetData sData, vbString
Do While InStr(1, sData, TERCHAR) <> 0
' plocka ut det första kommandot
sSingleLine = Mid(sData, 1, InStr(1, sData, TERCHAR) - 1)
' se på dess första tecken
Select Case Mid(sSingleLine, 1, 1)
Case "T"
' Det är text, så addera det i textboxen
txtDialog.Text = txtDialog.Text & Mid(sSingleLine, 2, Len(sSingleLine)) & vbCrLf
Case "Q"
' Ett Quit kommando, stäng anslutningen
Winsock1.Close
End Select
' Radera det mottagna kommandot från bufferten
sData = Mid(sData, InStr(1, sData, TERCHAR) + 1, Len(sData))
Loop
' Visa status
UpdateState
End Sub
Allt som txtSend_KeyPress gör är att sända den skrivna texten till den andra personen. Men Winsock1_DataArrival händelsen är lite mer komplicerad. Men denna något långsamma kontroll, kan göra att en eller båda datorerna kan få mer än ett kommando i taget från den andra datorn. Det avslutande tecken används för att separera kommandon om detta händer. Koden ovanför tar ut det som är mellan dessa avslutande tecknen och arbetar med varje kommando separat. Varje kommando som sänts innehåller ett kommando, följt av texten. Kommandot säger vad kommandot egentligen är. Om kommandot är "T" betyder det att text och data kommer och matas in i dialog textboxen. Om kommandot är "Q", betyder det att användaren stänger anslutningen.
Ett litet problem uppstår när texten uppstår i dialogboxen. Texten placeras i slutet, men default sätts texten till början. Därför måste man sätta en pekare i textboxen till radens slut så att den även visar den nyaste texten.
Private Sub txtDialog_Change()
' När txtDialog uppdateras, sätter vi pekaren till slutet, så du alltid
' ser den senaste texten.
txtDialog.SelStart = Len(txtDialog.Text)
End Sub
Nu behövs lite kod för att användaren skall kunna stänga anslutningen
Private Sub cmdClose_Click()
On Error Resume Next
' Servern måste vara den som stänger anslutningen, så om du
' inte är server, sänder vi kommandot "Q" till servern som
' dödar anslutningen åt oss.
If bConnected = True Then
' Fortsätt sända kommandot tills du är frånkopplad
' (om det inte fungerar första gången).
Do While Winsock1.State = sckConnected
' Skicka "Q" som betyder quit
Winsock1.SendData "Q" & TERCHAR
' Tillåt Windows hantera andra saker
DoEvents
Loop
End If
' Stäng din del av anslutningen också
Winsock1.Close
' Återställ flaggan till false eftersom det inte
' längre finns någon anslutning
bConnected = False
UpdateState
End Sub
Det finns problem om användaren ansluter (personen som inte lyssnade från början), avslutar sun anslutning. Det verkar bli så att anslutningen inte kan återställas om detta händer. Därför kan inte anslutaren avsluta en uppkoppling direkt. Istället måste den som ansluter skicka ett kommando till servern så den kopplar ner. Så det som händer är att kontrollera om du är server eller klient. Om du är klient, kan du avsluta direkt. Är du server (anslöt till någon), måste du sända Quit kommandot tills den andra kopplar ner anslutningen åt dig.
När den andra personen bryter anslutningen, lämnas du med en öppen anslutning så vi lägger till detta för att få det korrekt.
Private Sub Winsock1_Close()
' Om anslutningen har avslutats, stäng då även din
Winsock1.Close
UpdateState
End Sub
Om du stänger formen, eller avslutar programmet, måste också anslutningen avbrytas. Så, när användaren stänger formen, kontrolleras detta.
Private Sub Form_Unload(Cancel As Integer)
' När programmet avslutas, se till att du
' stänger anslutningen före.
cmdClose_Click
' avsluta inte förrän anslutningen är stängd
If Winsock1.State <> sckClosed Then
Cancel = True
End If
End Sub
Nu kan du köra projektet och direkt kommer du på massor av saker som du skulle vilja göra. Om du bara har en dator tillgänglig, så går det bra. Enklast är att bygga en .exe fil och köra den, starta ditt programi Visual Basic så du har två program igång. Klicka på lyssna på den filen du först startade och i txtIP fältet anger du din pc's lokala ipAdress nämligen 127.0.0.1 När du trycker Enter efter denna ipAdress kommer uppkopplingen ske. Kör du över Internet, gör du samma sak, men då väljer du en annan ipAdress