| |
VB.NET - Ein- und UmsteigerTCP 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. | |
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. | |
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? | |
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. | |
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 | |
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. | |
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? | |
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.
| |
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! | |
Re: Beispiel-Formular | | | Autor: Steini.m | Datum: 04.07.15 16:38 |
| Hat prima funktioniert, herzlichen Dank Manfred X | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|