Socket Server mit VB.NET

Um ein größeres Ziel zu verfolgen musste ich einen Socket Server schreiben. Tendenziell wird man bei Server an einen Lösungsansatz mit Service denken. Ich nehme aber eine einfach Winforms Anwendung, weil mein Server nur Sinn macht wenn ein Benutzer angemeldet ist. Im weitesten Sinn überwacht mein Socket Server ein Stück Hardware und meldet Daten in einer Art Event an eine Silverlight Anwendung. Die Implementierung erfolgt auf Alpha Prototyp Level. Also sicher noch erhebliches Refactoring Potential. Ich war wirklich faul und habe mich auch auf die vorhandenen Steuerelemente gestürzt und eben ein Timer Control (Timer1) auf das Formular gezogen.

Der Socket Server lauscht auf Port 5406, weil dies im Bereich der von Silverlight nutzbaren Ports liegt.

tcpL = New TcpListener(IPAddress.Parse("127.0.0.1"), 4506)
tcpL.Start()
tcpL.BeginAcceptSocket(AddressOf onConnect, Nothing)

Der Listener und auch der Client (es reicht eine Verbindung) wird global in der Forms Klasse definiert.

 Dim tcpL As TcpListener
 Dim tcpClient As TcpClient

Weil es später zur Laufzeit recht wenig Transparenz gibt, was das Programm gerade tut, schreibe ich in das Output Fenster von Visual Studio. Mit AcceptClient wird der Kanal geöffnet und gewartet bis sich ein Client meldet. Die eigentliche Kommunikation findet dann asynchron statt. Da ich die Daten die vom Silverlight Client gesendet werden nicht brauche, ist die Funktion der “ClientSpricht” leer.

Dim iasy As IAsyncResult
Private Sub onConnect(ByVal ia As IAsyncResult)
 Try
  tcpClient = tcpL.EndAcceptTcpClient(ia)
  iasy = tcpL.BeginAcceptTcpClient(AddressOf clientSpricht, Nothing)
  Trace.WriteLine("connected...")
 Catch ex As Exception
  Trace.WriteLine(ex.ToString())
 End Try
End Sub

Viel wichtiger ist, was der Server zum Server sagt. Dazu wird regelmäßig ein Timer Event gefeuert, das folgenden Code ausführt und die zur Demonstration Sekunden sendet.

If IsNothing(tcpClient) = False AndAlso tcpClient.Connected Then
  Dim networkStream As NetworkStream = tcpClient.GetStream
  Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytesDate.Now.Second.ToString)
  networkStream.Write(sendBytes, 0, sendBytes.Length)
Trace.WriteLine("sending..." + Date.Now.Second.ToString)
End If

Wie kann man nun feststellen das dieser Server auch funktioniert? Ganz einfach mit Telnet4358. Zuerst wird das Kommando telnet localhost 4506 eingegeben und dann erscheinen die Zahlen wie im Bild ersichtlich regelmäßig.

image

Kommentar schreiben