vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
TCP Socket Server 
Autor: Steini.m
Datum: 29.06.15 22:43

Hallo,

ich habe nach dieser Anleitung einen TCP Socketserver in meine Anwendung implementiert:
https://msdn.microsoft.com/de-de/library/6y0e13d3(v=vs.110).aspx

Geht das auch irgendwie eleganter, so dass der Process irgendwie als Thread im Hintergrund läuft?
Wenn ich den Server starte ist mein komplettes Form blockiert, solange der Server lauscht. Ich habe aber eine simple Anwendung, welche gelegentlich Daten von diversen Clients empfängt und auswertet, deshalb sollte die Anwendung laufen und bedienbar sein, gleichzeitig sollte der Socketserver jedoch den Port überwachen.

Finde hierzu leider keine brauchbaren Informationen, wahrscheinlich suche ich nach den falschen Begriffen, bin mir aber ziemlich sicher, dass es relativ einfach möglich ist. Ohne extra einen Dienst hierfür zu installieren etc.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP Socket Server 
Autor: Blackbox
Datum: 01.07.15 21:23

Hi,

Dein Beispielprogramm solltest Du breits in einem WorkerThread laufen lassen, und nicht im Main-Thread.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TCP Socket Server 
Autor: Steini.m
Datum: 01.07.15 22:48

Genau das ist ja meine Frage.
Wie ruft man das Objekt dann auf bzw. wie startet man den Wirkung Therese?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Beispiel-Formular 
Autor: Manfred X
Datum: 02.07.15 06:24

Ich habe das Beispiel, auf das Du Dich beziehst ein wenig ausgebaut
Nichts tolles ...!!!

Hier zunächst ein Formular (Windows.Forms-Anwendung), das die
beiden Klassen SynchronousSocketListenerClient/Server verwendet.

Nach dem Start kann das Formular einmal als Server (Button) oder
mehrfach als Client verwendet werden.

Die Socket-Klassen laufen jeweils in eigenen Threads.
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports Microsoft.VisualBasic
 
Public Class frmSynchronousSocketDemo
 
    Dim txtMsg As New TextBox With _
        {.Parent = Me, .Width = 200, .Height = 200, .Multiline = True}
 
    Dim WithEvents btnServer As New Button With _
        {.Parent = Me, .Text = "Start Server", .Top = 210, .Width = 100}
 
    Dim WithEvents btnClient As New Button With _
        {.Parent = Me, .Text = "Send Message", _
         .Top = 210, .Left = 110, .Width = 100}
 
    Dim WithEvents server As SynchronousSocketListenerServer
    Dim client As SynchronousSocketListenerClient
 
    Dim IsServerActive As Boolean
 
    Private Delegate Sub StringDelegate(ByVal str As String)
 
    Dim serverthread As Threading.Thread
    Dim ClientThread as Threading.Thread
 
    Private Sub btnServer_Click(sender As System.Object, _
            e As System.EventArgs) Handles btnServer.Click
 
        If IsServerActive Then
            MsgBox("Der Server ist bereits aktiv") : Exit Sub
        End If
 
        'Server-Instanz starten
        Me.Text = "Gestartet als Server"
        server = New SynchronousSocketListenerServer
        Dim threadstart As New Threading.ThreadStart(AddressOf server.Listen)
        serverthread = New Threading.Thread(threadstart)
        IsServerActive = True
        btnClient.Enabled = False
        serverthread.Start()
    End Sub
 
 
    Private Sub btnClient_Click(sender As System.Object, _
        e As System.EventArgs) Handles btnClient.Click
 
        Me.Text = "Gestartet als Client"
 
        'Text als Nachricht vom Client an den Server senden
        client = New SynchronousSocketListenerClient
        client.TextToSend = txtMsg.Text
        btnServer.Enabled = False
        Dim threadstart As New Threading.ThreadStart(AddressOf client.Send)
        clientthread = New Threading.Thread(threadstart)
        clientthread.Start()
    End Sub
 
 
    Private Sub server_Received(msg As String) Handles server.Received
        'Server hat eine Nachricht empfangen
        Me.Invoke(New StringDelegate(AddressOf ShowMessage), msg)
    End Sub
 
 
    Private Sub ShowMessage(ByVal msg As String)
        txtMsg.Text = "Empfangene Nachricht  " & vbcrlf & _
            Now.ToString & vbCrLf & msg
    End Sub
 
 
    Private Sub frmSynchronousSocketDemo_FormClosing(sender As Object, _
        e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If IsServerActive Then server.Dispose()
    End Sub
End Class


Beitrag wurde zuletzt am 02.07.15 um 06:42:27 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Die Client-Klasse 
Autor: Manfred X
Datum: 02.07.15 06:27

Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
 
Public Class SynchronousSocketListenerClient
 
    Public Property TextToSend As String
 
    Public Sub Send()
 
        Const endchars As String = _
             SynchronousSocketListenerServer.endchars
 
        Dim mml As Integer = _
             SynchronousSocketListenerServer.MaxMessageLength
 
        Dim bytes(mml) As Byte
 
        ' Connect to a remote device.
 
        ' Establish the remote endpoint for the socket.
        ' This example uses port 11000 on the local computer.
        Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
        Dim ipAddress As IPAddress = ipHostInfo.AddressList(2)
        Dim remoteEP As New IPEndPoint(ipAddress, 11000)
 
 
        Dim msg() As Byte
        Dim text As String, tl As Integer = TextToSend.Length + 1
        Do
            tl -= 1
            text = TextToSend.Substring(0, tl)
            If String.IsNullOrEmpty(text) Then
                text = "Leere Botschaft"
            End If
 
            If Not text.EndsWith(endchars) Then
                text &= endchars
            End If
            msg = Encoding.ASCII.GetBytes(text)
        Loop While msg.Length > mml
 
 
        Dim sender As Socket = Nothing
        Dim bytesrec As Integer
        Try
            ' Create a TCP/IP socket.
            sender = New Socket(AddressFamily.InterNetwork, _
                SocketType.Stream, ProtocolType.Tcp)
 
            ' Connect the socket to the remote endpoint.
            sender.Connect(remoteEP)
 
            ' Send the data through the socket.
            Dim bytesSent As Integer = sender.Send(msg)
            ' Receive the response from the remote device.
            bytesrec = sender.Receive(bytes)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
 
        ' Release the socket.
        If sender IsNot Nothing Then
            If sender.Connected Then
                sender.Shutdown(SocketShutdown.Both)
            End If
            sender.Close()
        End If
    End Sub
End Class 'SynchronousSocketClient
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Die Server-Klasse 
Autor: Manfred X
Datum: 02.07.15 06:29

Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
 
Class SynchronousSocketListenerServer
    Implements IDisposable
 
    Public Event Received(ByVal msg As String)
    Public Property data As String = Nothing
 
    Private handler As Socket
    Private Listener As Socket
    Private IsListening As Boolean
 
    Public Const endchars As String = "<EOF>"
    Public Const MaxMessageLength As Integer = 2048
 
 
    Public Sub Listen()
 
        ' Data buffer for incoming data.
        Dim bytes() As Byte
 
        ' Establish the local endpoint for the socket.
        Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
        Dim ipAddress As IPAddress = ipHostInfo.AddressList(2)
        Dim localEndPoint As New IPEndPoint(ipAddress, 11000)
 
        Try
            ' Create a TCP/IP socket.
            Listener = New Socket(AddressFamily.InterNetwork, _
                SocketType.Stream, ProtocolType.Tcp)
 
            ' Bind the socket to the local endpoint and 
            ' listen for incoming connections.
            Listener.Bind(localEndPoint)
            Listener.Listen(10)
            IsListening = True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Exit Sub
        End Try
 
        ' Start listening for connections.
        While IsListening
            ' Program is suspended while waiting for an incoming connection.
            Try
                handler = Listener.Accept
                data = Nothing
                ' An incoming connection needs to be processed.
                While True
                    bytes = New Byte(MaxMessageLength) {}
                    Dim bytesRec As Integer = handler.Receive(bytes)
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec)
                    If data.IndexOf(endchars) > -1 Then
                        Exit While
                    End If
                End While
 
                data = data.Substring(0, data.Length - endchars.Length)
                RaiseEvent Received(data)
 
                ' Echo the data back to the client.
                Dim msg As Byte() = Encoding.ASCII.GetBytes(data)
 
                handler.Send(msg)
                handler.Shutdown(SocketShutdown.Both)
                handler.Close()
            Catch
                'wegen Beendigung beim Dispose
            End Try
        End While
    End Sub
 
 
#Region "IDisposable Support"
    Private disposedValue As Boolean
 
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                IsListening = False
                If Listener IsNot Nothing Then
                    If Listener.Connected Then Listener.Disconnect(False)
                End If
                Listener.Dispose()
            End If
        End If
        Me.disposedValue = True
    End Sub
 
    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region
 
End Class


Beitrag wurde zuletzt am 02.07.15 um 06:32:28 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Die Server-Klasse 
Autor: Steini.m
Datum: 02.07.15 09:05

Super, vielen Dank. Werde es heute abend gleich mal ausprobieren.

Mir ist aber beim überfliegen des Codes immer noch nicht ganz klar, wie das mit dem Hintergrundthread nun funktionieren soll?! Ist das schon implementiert oder wie würde der Aufruf/Deklaration bspw. aus dem Sub eines Mainforms aussehen, so dass der Server im Hintergrund läuft und nicht das Form blockiert?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Die Server-Klasse 
Autor: Manfred X
Datum: 02.07.15 09:17

Das ist viel drin!

ThreadStart, Benachrichtigungs-Event aus dem Server-Thread,
Per Invoke an ein Control (Textbox) weitergeleitete Meldung,
Dispose-Implementierung usw.

Du startest die Anwendung und clickst den Server-Button.
Damit startet das Listening - trotzdem kannst Du Buttons
drücken oder Text in die Textbox eingeben.

Wenn Du die Anwendung ein weiteres mal startest, kannst Du
Text in die Textbox eingeben und auf Senden clicken.
Der empfangene Text erscheint in der Textbox der Serveranwendung.
Dort eingegebener/angezeigter Text wird dadurch überschrieben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Die Server-Klasse 
Autor: Steini.m
Datum: 02.07.15 10:46

Ja, ich bin was doof... muss an der Hitze liegen!
Hab mir nur die Server-Klasse angesehen.
Steht ja alles im Bsp.-Formuar
Danke!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Beispiel-Formular 
Autor: Steini.m
Datum: 04.07.15 16:38

Hat prima funktioniert, herzlichen Dank Manfred X
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel