IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Visual Basic - Programmierung eines simplen TCP-Chats in VB



Programmierung eines simplen TCP-Chats in VB

Dieser Artikel zeigt, wie Sie mit VB ein einfaches Programm für die Netzwerkkommunikation über TCP mit Hilfe des Winsock-Steuerelements schreiben können.


Autor: Tobias Surmann (incsoft)
Datum: 28-05-2003, 21:56:06
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 13804x
Rating: 4.75 (4x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einleitung

Dieser Artikel zeigt, wie Sie mit VB ein einfaches Programm für die Netzwerkkommunikation über TCP mit Hilfe des Winsock-Steuerelements schreiben können. Vorraussetzung hierfür ist allerdings, dass Sie mindestens über die Professional Edition von Visual Basic 6 verfügen, da in der Standard Edition das Winsock-Steuerelement noch nicht vorhanden ist. Wird TCP für die Kommunikation zwischen einzelnen PCs benutzt, so heißt dies, dass es zumindest einen Server und einen oder mehrere Clients geben muss. Im folgenden müssen deshalb zwei kleine Visual Basic Programme entworfen werden, einmal eines für den Client und eins für den Server.

Einfügen von Winsock in die Entwicklungsumgebung

Standardmäßig ist das Winsock-Steuerelement nicht in der Werkzeugleiste von Visual Basic zu sehen. Damit das benötigte Steuerelement dort hinzugefügt wird und Ihnen für die weiteren Programmierarbeiten zur Verfügung steht, klicken Sie auf Projekt | Komponenten… und wählen Sie im erscheinenden Dialog den Listeneintrag Microsoft Winsock Control 6.0 aus.




Als Ergebnis erscheint ein kleines Symbol für das hinzugefügte Winsock-Steuerelement in der Werkzeugleiste.




Der Server

Der Server ist dafür zuständig Verbindungsanfragen, die von den Clients kommen zu prüfen und anzunehmen. Für die Kommunikation mit dem Client wird in diesem Beispielprojekt der Port 1111 benutzt. Über die Listen-Methode des Winsock-Steuerelements wird der Server aktiviert.

Bauen Sie ein Formular gemäß der nachfolgenden Abbildung auf und speichern Sie das Projekt unter dem Dateinamen prjServer.vbp sowie frmServer.frm.




Stellen Sie die Eigenschaft Multiline von txtOutput auf True.

Bereits beim Laden der Anwendung muss der Port 1111 geöffnet und der TCP-Server aktiviert werden, damit der Client später eine Verbindung herstellen kann. Daher schreiben wir in das Form_Load-Ereignis folgenden Quelltext:

Private Sub Form_Load()

	Winsock1.Protocol = sckProtocolTCP
	Winsock1.LocalPort = 1111
	Winsock1.Listen

End Sub

Damit wäre die Initialisierung auch schon abgeschlossen. Der Server wartet nun auf die Verbindungsanfrage eines Clients. Diese wird im ConnectionRequest-Ereignis des Winsock-Controls behandelt.

Private Sub Winsock1_ConnectionRequest(Byval requestID As Long)

	If Winsock1.State <> sckClosed Then Winsock1.Close

	Winsock1.Accept requestID

End Sub

Zuerst stellen wir fest, ob schon eine Verbindung besteht. Falls dies zutrifft, schließen wir die aktuelle Verbindung. Indem wir der Accept-Methode die Variable requestID übergeben, stellen wir eine neue Verbindung zum entsprechenden Client her.

Wurde die Verbindung erfolgreich aufgebaut, so kann der Client nun Daten an den Server senden. Werden Daten vom Winsock-Steuerelement empfangen, wird das Ereignis DataArrival ausgelöst. Dort können nun die empfangenen Daten wieder ausgelesen werden und dem entsprechenden Ausgabefeld hinzugefügt werden.

Private Sub Winsock1_DataArrival(Byval bytesTotal As Long)

	Dim strTemp As String

	Winsock1.GetData strTemp
	txtOutput.Text = txtOutput.Text & vbNewLine & _	Winsock1.RemoteHost & ": " & strTemp

End Sub

Gleichzeitig kann der Server nicht nur Daten empfangen, sondern selbst auch Daten an den Client versenden. Wenn im Eingabefeld die Return-Taste gedrückt wird, so wird die Nachricht an den Client verschickt und dem Ausgabefeld hinzugefügt.

Private Sub txtMessage_KeyUp(KeyCode As Integer, Shift As Integer)

If Winsock1.State = sckConnected And KeyCode = 13 Then

Winsock1.SendData txtMessage.Text
txtOutput.Text = txtOutput.Text & vbNewLine & _ Winsock1.LocalHostName & ": " & txtMessage.Text
     txtMessage.Text = ""
        
End If

End Sub

Zuerst wird auch hier geprüft, ob überhaupt eine Verbindung besteht. Zusätzlich muss noch die Return-Taste (KeyCode = 13) gedrückt worden sein, damit die Nachricht über die SendData-Methode verschickt werden kann. Danach wird der Rechnername und der geschriebene Text dem Ausgabefenster hinzugefügt, ähnlich wie man das von ICQ her kennt. Zum Schluss wird das Eingabefeld wieder zurückgesetzt.

Damit ist die Programmierung des Servers abgeschlossen.

Der Client

Der Client ist dafür zuständig eine Verbindung zum Server aufzubauen. Meist ist es auch der Client, der die Verbindung nach getaner Arbeit wieder schließt. Der Aufbau des Clients ähnelt stark dem des Servers, da wir für die Verbindung zum Server keine eigene Schaltfläche einbauen, sondern beim Start des Programms automatisch eine Verbindung zum Server hergestellt wird. Dies setzt voraus, dass bei späterer Nutzung des Programms der Server schon aktiv sein muss, wenn der Client gestartet wird. Aber dazu später mehr. Der Aufbau des Programms ist vom Aussehen her der gleiche wie beim Serverprogramm, nur lautet die Beschriftung der Titelleiste nun Client, damit man beim späteren Test nachvollziehen kann, welches Programm wo läuft:




Speichern Sie das Projekt unter dem Namen prjClient.vbp und frmClient.frm.

Einige Teile des Codes vom Serverprogramm können wir für den Client weiterverwenden.

Private Sub Winsock1_DataArrival(Byval bytesTotal As Long)

	Dim strTemp As String

	Winsock1.GetData strTemp
	txtOutput.Text = txtOutput.Text & vbNewLine & _	Winsock1.RemoteHost & ": " & strTemp

End Sub

Private Sub txtMessage_KeyUp(KeyCode As Integer, Shift As Integer)

If Winsock1.State = sckConnected And KeyCode = 13 Then

Winsock1.SendData txtMessage.Text
txtOutput.Text = txtOutput.Text & vbNewLine & _ Winsock1.LocalHostName & ": " & txtMessage.Text
     txtMessage.Text = ""
        
End If

End Sub

Für die Verbindungsherstellung zum Server müssen wir uns allerdings eine andere Lösung einfallen lassen, denn der Client ist dafür zuständig eine Verbindungsanfrage an den Server zu senden. Dies erledigt die Connect-Methode des Winsock-Steuerelements für uns.

Private Sub Form_Load()

	Dim strRemoteHost As String

	strRemoteHost = InputBox("Bitte Rechnernamen eingeben!")

	Winsock1.Protocol = sckProtocolTCP
	Winsock1.RemoteHost = strRemoteHost
	Winsock1.RemotePort = 1111
	Winsock1.Connect

End Sub

Um eine Verbindung zum Serverprogramm aufbauen zu können, muss der Rechnername des Computers auf dem der Server läuft bekannt sein. Dieser wird hier mit einer einfachen InputBox abgefragt.

Wird das Fenster des Clients geschlossen, so muss die Verbindung zum Server getrennt werden. Dies geschieht durch den Aufruf der Close-Methode des Winsock-Steuerelements.

Private Sub Form_Unload()

	Winsock1.Close

End Sub


Test

Da wir sowohl die Programmierung des Servers als auch des Clients abgeschlossen haben, erfolgt nun der Test, ob alles einwandfrei funktioniert. Dafür benötigen Sie noch nicht mal zwei Computer, denn eine TCP-Verbindung kann auch auf einem Rechner aufgebaut werden. Beachten Sie, dass Sie auf jeden Fall zunächst das Serverprogramm starten müssen und erst danach der Client gestartet werden kann. Schreiben Sie auf beiden Seiten ein paar Zeilen und Sie werde merken, dass das Ganze einem Chatprogramm wie ICQ schon recht ähnlich ist, obwohl es noch sehr viele Erweiterungsmöglichkeiten gibt. Wie Sie das Programm erweitern bleibt Ihnen überlassen.




Zusammenfassung

In diesem Artikel haben Sie gelernt, wie Sie
  • eine Verbindung zwischen Client und Server aufbauen
  • Daten zwischen Client und Server austauschen
  • eine Verbindung wieder schließen
  • Ihre Programme auf Funktionstüchtigkeit testen
  • ein kleines Chatprogramm entwickeln.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04503
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16551
Queueeinträge:06236
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1137
Comments: 0