Hi!
Ich habe mir eine Socket-Listener-Klasse geschrieben, die auch gut funktioniert.
Jedoch bin ich dabei auf ein Problem gestoßen.
Ich verwende asynchronen Datenempfang.
Ich möchte, dass sich ein Fenster öffnet sobald der Socket Daten empfängt, welches diese in eine Zeichenkette umgewandelt anzeigt.
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.IO
Imports System.Threading
Imports System.Text.Encoding
Public Class Network
Public Class Server
Public Sub StartListener()
Dim ListenerThread As New Thread(AddressOf StartListening)
ListenerThread.IsBackground = True
ListenerThread.Start()
End Sub
Public allDone As New ManualResetEvent(False)
Private Sub StartListening()
Try
Dim server As New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, ProtocolType.Tcp)
server.Bind(New IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555))
server.Listen(5)
While True
allDone.Reset()
server.BeginAccept(AddressOf AcceptCallBack, server)
allDone.WaitOne()
End While
Catch e As Exception
MessageBox.Show(e.Message)
End Try
End Sub
Private Sub AcceptCallBack(ByVal ar As IAsyncResult)
Dim Listener As Socket = CType(ar.AsyncState, Socket)
Dim handler As Socket = Listener.EndAccept(ar)
Dim state As New StateObject
state.workSocket = handler
Array.Clear(state.buffer, 0, state.buffersize)
handler.BeginReceive(state.buffer, 0, StateObject.buffersize, _
SocketFlags.None, AddressOf ReceiveCallBack, state)
End Sub
Private Sub ReceiveCallBack(ByVal ar As IAsyncResult)
Dim state As StateObject = CType(ar.AsyncState, StateObject)
Dim handler As Socket = state.workSocket
Dim content As String = String.Empty
Dim bytesRead% = handler.EndReceive(ar)
content = ASCII.GetString(state.buffer)
If bytesRead > 0 Then
handler.BeginReceive(state.buffer, 0, state.buffersize, _
SocketFlags.None, AddressOf ReceiveCallBack, state)
Dim msgwin As New MsgWindow(content)
msgwin.Show()
End If
Array.Clear(state.buffer, 0, state.buffersize)
End Sub
End Class
Public Class StateObject
Public workSocket As Socket = Nothing
Public Const buffersize As Integer = 1023
Public buffer(buffersize) As Byte
End Class
End Class Bei diesem Code öffnet sich zwar das Fenster bei Datenempfang, es reagiert aber nicht und zeigt nur weißen Hintergrund im Client-Bereich an, sonst nichts ...
Man achte auf die Methode ReceiveCallBack...
Habt ihr eine Idee, wie man das Fenster zum Reagieren bringen könnte?
Ich hab selbst auch schon ein paar Sachen versucht umzuändern.
Hat aber alles nicht geholfen...
Ich bedanke mich für Hilfe! |