Freeware
Programme
VB-Bibliotheken
VB-Sourcecode Tipps&Tricks
|
|
|
|
Internet-Programmierung unter VB
Socket-Klasse
Beispiel-Code
TCP-Client
Um an einen TCP-Server Daten versenden zu können, muß man erstens seinen Rechnernamen ("dnsname") oder sein IP-Adresse ("xx.xx.xx.xx") kennen und zweitens wissen, an welchem Port er lauscht.
Ein Web-Server lauscht z.B. in der Regel an Port 80.
'Socket deklarieren
Private WithEvents sck As Socket
Private answer$
'Socket-Instanz erstellen (z.B. in Form_Load)
Sub Form_Load()
Set sck = New Socket
End Sub
'Verbindung aufbauen, Daten versenden, Verbindung schließen
Sub xxx()
sck.LineSeparator = vbCrLf 'optional, auch andere beliebige Trennzeichen möglich!
sck.Connect host, port
Do While sck.State = sockConnecting: WaitMessage: DoEvents: Loop
If sck.State <> sockConnected Then Exit Sub 'Verbindung nicht möglich
...
sck.SendData daten
antwort$ = GetAnswer()
...
sck.Disconnect
End Sub
'Ereignisse zum Datenempfang
Sub sck_DataArrival(BinData() As Byte, RemoteHostIP As String)
...
End Sub
Sub sck_LineDataArrival(LineData As String, RemoteHostIP As String)
answer$ = LineData
End Sub
Function GetAnswer() As String
Do While Len(answer$) = 0: WaitMessage: Loop
GetAnswer = answer$: answer$ = ""
End Sub
|
benötigt zusätzlich aus dem Download-Paket:
Socket.cls
Socket.bas
- Das
DataArrival-Ereignis tritt ein, wenn Daten eintreffen.
- Das
LineDataArrival-Ereignis tritt anstelle des DataArrival-Ereignisses ein, wenn die Eigenschaft LineSeparator ein Trennzeichen vorgibt und das Trennzeichen komplett empfangen wurde. Der LineData-Parameter enhält das Trennzeichen nicht mehr.
TCP-Server
Ein TCP-Server lauscht immer an einem bestimmten Port. Es ist natürlich entsprechend auf einem Rechner jeder Port zu einem Zeitpunkt nur von einem
Server zu verwenden. Bei einer eingehenden Verbindung wird ein neuer Socket erstellt - dieser ist dann Peer-to-Peer mit dem Client verbunden.
'Socket deklarieren
Public WithEvents sck As Socket
Public Clients As New Collection
'Socket-Instanz erstellen (z.B. in Form_Load)
Sub Form_Load()
Set sck = New Socket
End Sub
'Server starten und stoppen
Sub StartServer()
sck.LocalPort = port
sck.Listen
End Sub
Sub StopServer()
sck.Disconnect
End Sub
'eine Verbindung geht ein
Private Sub sck_ConnectionRequest()
Dim conn As New MyConnection
conn.Init sck, Me
Clients.Add conn 'wichtig, damit VB die Referenz nicht entsorgt
End Sub
|
Behandlung einer eingehenden Verbindung innerhalb der Klasse MyConnection:
'Socket deklarieren
Private WithEvents sck As Socket
Private serverform As Form
'Socket-Instanz erstellen und konfigurieren
Private Sub Class_Initialize()
Set sck = New Socket
sck.LineSeparator = vbCrLf 'optional
End Sub
'Verbindung vom Server annehmen
Public Sub Init(server As Socket, svrform as Form)
sck.Accept server
Set serverform = svrform
End Sub
'Client hat Verbindung getrennt
Private Sub sck_Closed()
Set sck = Nothing
For n% = 1 To serverform.Clients.Count
If serverform.Clients(n%) Is Me Then serverform.Clients.Remove n%: Exit For
Next
End Sub
'vom Client empfangene Datn verarbeiten und Antwort senden
Private Sub sck_LineDataArrival(LineData As String, RemoteHostIP As String)
...
sck.SendData "antwort"
'falls Sie hier sck.Disconnect aufrufen, dann auch sck_Closed aufrufen!
...
End Sub
|
benötigt zusätzlich aus dem Download-Paket:
Socket.cls
Socket.bas
UDP-Client
UDP ist verbindunglos, d.h. der Client sendet Pakete an den Server und weiss im folgenden nichts darüber. Eine Bestätigung für das Ankommen gibt es nicht! Eine Garantie, dass die Pakete in der gleichen Reihenfolge ankomme, wie sie gesendet wurden, gibt es auch nicht!
Besonders für multimediale Anwendungen (Audio, Video) wird UDP aber häufig eingesetzt, da die Übertragung ohne den TCP-Protokoll-Overhead performanter ist und auf nicht angekommene Pakete sowie verzichtet werden kann.
Desweiteren ist es möglich, Broadcast-Nachrichten an alle Teilnehmer eines (meist: des eigenen) Subnetzes zu senden.
sck.SendDataTo daten, host, port
|
- Die Methoden
sck.Connect und sck.Disconnect sind nicht notwendig, da per Definition verbindungslos.
- Der Client kann nur Daten empfangen, indem er selbst als Server auftritt (denn es besteht ja keine Verbindung)!
- Broadcast-Nachrichten: host="" (=lokales Broadcast) oder host="xx.xx.xx.255"
UDP-Server
Der UDP-Server funktioniert analog zur TCP-Variante, mit der Ausnahme, dass keine spezielle Klasse zur Beantwortung benötigt wird.
Es kommen schließlich nur Pakete an, und es wird keine Peer-to-Peer-Verbindung aufgebaut.
'Socket deklarieren
Private WithEvents sck As Socket
'Socket-Instanz erstellen (z.B. in Form_Load)
Sub Form_Load()
Set sck = New Socket
End Sub
'Server starten und stoppen
Sub StartServer()
sck.Protocol = protocolUDP
sck.LocalPort = port
sck.LineSeparator = vbCrLf 'optional
sck.Listen
End Sub
Sub StopServer()
sck.Disconnect
End Sub
'Ereignisse zum Datenempfang
Sub sck_DataArrival(BinData() As Byte, RemoteHostIP As String)
...
End Sub
Sub sck_LineDataArrival(LineData As String, RemoteHostIP As String)
...
End Sub
|
- vor dem Start des Servers das Protokoll einstellen:
sck.Protocol = protocolUDP
- Das Ereignis
ConnectionRequest tritt nicht auf, sondern die Daten kommen direkt im Server-Socket per [Line]DataArrival-Ereignis an, daher auch beim Server-Socket ggf. die Eigenschaft LineSeparator einstellen!
- Da (per Definition) keine Verbindung besteht, kann man im
[Line]DataArrival-Ereignis auch nur per SendDataTo-Methode antworten!
|
|