Gör detta först
Det första du måste göra är att ordna en referens till "Microsof
Winsock Control", det gör du genom att trycka på Project + Components i
menyn. Du måste också göra en referens till "Microsoft Rich Textbox Control".
Sedan kan vi utforma formen. Vi börjar med servern.
Du behöver
Två RichTextBox, två Label och en Winsock-kontroll. Placera dem efter eget tycke eller som på bilden.

Sedan kan vi sätta egenskaperna för kontrollerna.
En av textboxarna:
- Name: TxtLog
- Locked: True
- Scrollbars: 3 - rtfBoth
- Text: blank
Den andra textboxen:
- Name: TxtText
- Scrollbars: 3 - rtfBoth
- Text: blank
Den ena labelkontrollen:
- Name: LblSkriv
- AutoSize: True
- Caption: Skriv text och tryck Enter:
Den andra labelkontrollen:
- Name: LblStatus
- AutoSize: True
- Caption: Status: Vilar
Winsockkontrollen:
Koden för servern
Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hwndLock As Long) As Long
Const Port = "0" 'Den port som skall lyssnas på
Dim ShiftDown As Boolean
Const Port anger vilken port som servern skall lyssna på. 0 anger att
den skall lyssna på en ledig port.
Du kan också ange vilken den skall använda, genom att ändra 0 till
exempelvis 3859.
Funktionen är ett API som man kan använda för att låsa och låsa upp uppdateringen
av fönstret.
Private Sub Form_Load()
With Socket(0)
.LocalPort = Port 'Anger vilken port servern ska lyssna på
.Listen 'Säger åt den att lyssna
End With
Me.Caption = "Server - Port:" & Socket(0).LocalPort & " - Local IP: " & Socket(0).LocalIP 'Ändrar formens titel
Status "Lyssnar" 'Sätter LblStatus till Lyssnar
End Sub
LocalPort anger vilken port servern skall
lyssna på och vilken port som klienten skall ansluta till. Listen gör att servern börjar lyssna efter klienter. Private Sub Socket_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Load Socket(Socket.UBound + 1) 'Laddar en ny Socket i samlingen
Socket(Socket.UBound).Accept requestID 'Börjar lyssna
End Sub
Ovanstående kod laddar en ny socket i samlingen, så att flera klienter kan
ansluta till servern samtidigt.
Private Sub Form_Unload(Cancel As Integer)
Dim i As Integer
For i = 0 To Socket.UBound 'Loopar igenom alla Socket
If Not Socket(i).State = sckClosed Then 'Kollar om socket är ansluten
If Socket(i).State = sckConnected Then Socket(i).SendData "Server: Servern stängs nu" 'Skicka ett
meddelande om att servern stängs
DoEvents 'Väntar
Socket(i).Close 'Stänger Socket
End If
Next i
End Sub
Ovanstående kod loopar igenom alla sockets och skickar ett meddelande till
klienterna om att servern stängs till dem som är anslutna.
Private Sub Socket_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim data As String 'Där datan hammnar
Socket(Index).GetData data, vbString 'Hämta datan som skickades
Status "Bearbetar data" 'Ändrar status
If Mid(data, 1, 1) = Chr(1) Then 'Kolla om det första teknet var chr(1)
Select Case Mid(data, 2, 3) 'Kollar vilket kommando det är
Case "anv" 'Klienten vill ange/ändra sitt användarnamn
Socket(Index).Tag = Mid(data, 6, Len(data)) 'Ändrar användarnamnet
Case "tim" 'Klienten vill veta tiden
Socket(Index).SendData "Klockan: " & Time 'Skicka tiden
Case "log" 'Klienten vill hämta den aktuella konversationen
Socket(Index).SendData TxtLog.Text 'Skicka konversationen
Case "dat" 'Klienten vill veta datumet
Socket(Index).SendData "Datum: " & Date 'Skicka datum
End Select
Else 'Om det inte var ett kommando så är det vanlig text
SkickaVidare data, Socket(Index).Tag 'Skickar vidare texten till andra klienter
Dim Temp As String 'Här hamnar det nuvarande text som finns i TxtLog
LockWindowUpdate Me.hWnd 'Förhindra att Windows ritar om fönstret
Temp = TxtLog.Text 'Sätter Temp till texten i TxtLog
TxtLog.Text = Socket(Index).Tag & ": " & vbCrLf & data & vbCrLf & Temp & vbCrLf 'Sätter in den nya och den gamla texten i TxtLog
LockWindowUpdate 0& 'Säger åt Windows att rita om fönstret igen
End If
Status "Lyssnar" 'Ändrar status
End Sub
Ovanstående kod tar hand om all data som kommer från en
klient, kollar om det är ett kommando och i så fall vilket.Om det inte
var ett kommando skickar den datan vidare till de andra klienterna och
visar det i TxtLog.
Sub SkickaVidare(Text As String, Användare As String)
Dim i As Integer
For i = 1 To Socket.UBound 'Om i börjar med 0 så händer ingenting
If Socket(i).State = sckConnected Then 'Kollar om klienten är ansluten
Socket(i).SendData Användare & ": " & vbCrLf & Text & vbCrLf 'Skickar texten
DoEvents 'Väntar till föregående skickade text är skickad, annars skickas det bara till en
klient
End If
Next i
End Sub
Ovanstående kod koden skickar texten vidare till de andra anslutna
klienterna.
Sub Status(Text As String)
LblStatus.Caption = "Status: " & Text 'Ändrar status
End Sub
Private Sub TxtText_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyShift Then ShiftDown = True 'Sätter ShiftDown till sant om man trycker ned shift
End Sub
Private Sub TxtText_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyShift Then ShiftDown = False 'Sätter ShiftDown till falskt om man släpper shift
End Sub
"Sub Status" ändrar texten som står i LblStatus och TxtText_KeyDown.
TxtText_KeyUp ändrar värdet ShiftDown.
Private Sub TxtText_KeyPress(KeyAscii As Integer)
If Socket.UBound = 0 Then Exit Sub
If KeyAscii = 13 Then
If Not ShiftDown Then
LockWindowUpdate Me.hWnd
SkickaVidare TxtText.Text, "Server"
Dim Temp As String 'Här hamnar det nuvarande text som finns i TxtLog
Temp = TxtLog.Text 'Sätter Temp till texten i TxtLog
TxtLog.Text = "Server: " & vbCrLf & TxtText.Text & vbCrLf & Temp & vbCrLf 'Sätter in den nya och den gamla texten i TxtLog
TxtText.Text = "" 'Rensar TxtText
KeyAscii = 0 'Förhindrar att datorn piper
LockWindowUpdate 0& 'Säger åt Windows att rita om fönstret igen
End If
End If
End Sub
Ovanstående kod skickar serverns text vidare till de
anslutna klienterna.
Därmed är servern klar, så kan vi gå över till
Klienten
|