Ich habe ein , meiner Meinung nach, extrem merkwürdiges Problem mit einem, von mir modifizierten, VersuchsChat mit leistungsfähigem Server .
Ich
habe ein Event das ausgelöst wird, wenn einer der Clients eine Naricht
bekommt. Und jedes Client Objekt hat ein Objekt, das ein paar Infos
besitzt. Soweit so gut, nur das Problem ist, dass wenn ich z.B. schreibe kommt einfach nur der Nickname und die Nachricht wird sozusagen abgeschnitten.
Hier mal der "wichtige" Code:
Client
Spoiler anzeigen
Settingsklasse
Spoiler anzeigen
EventArgs
Spoiler anzeigen
Server
Spoiler anzeigen
Form1 (zum Testen des Codes)
Spoiler anzeigen
Wäre super, wenn mir jemand helfen könnte, da ich schon den ganzen Abend an diesem Problem hänge
Vielleicht ist der String ja einfach verflucht, wer weiß
MfG
Ich
habe ein Event das ausgelöst wird, wenn einer der Clients eine Naricht
bekommt. Und jedes Client Objekt hat ein Objekt, das ein paar Infos
besitzt. Soweit so gut, nur das Problem ist, dass wenn ich z.B. schreibe kommt einfach nur der Nickname und die Nachricht wird sozusagen abgeschnitten.
Hier mal der "wichtige" Code:
Client
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Text
- Imports TCPAsynServer.Disposer
- Imports TCPAsynServer.EventArgs
- Imports System.Net
- Public Class Client : Implements IDisposable
- Private _TcpClient As TcpClient
- Private _Stream As NetworkStream
- Private Buf(&H400 - 1) As Byte
- Public settingsObject As Object
- Public ReadOnly Property TcpClient As TcpClient
- Get
- Return _TcpClient
- End Get
- End Property
- Public Sub New(ByVal TC As TcpClient)
- _TcpClient = TC
- _Stream = _TcpClient.GetStream
- End Sub
- Public Sub New(ByVal IP As Long, ByVal Port As UShort)
- Me.New(New TcpClient(New IPEndPoint(IP, Port)))
- End Sub
- Public Sub New(ByVal _IPEndPoint As IPEndPoint)
- Me.New(New TcpClient(_IPEndPoint))
- End Sub
- Private Sub EndRead(ByVal ar As IAsyncResult)
- If Me.IsDisposed Then Return
- Dim read As Integer = 0
- Try
- read = _Stream.EndRead(ar)
- Catch
- CrossThread.RunGui(AddressOf Dispose)
- Return
- End Try
- If read = 0 Then
- CrossThread.RunGui(AddressOf Dispose)
- Return
- End If
- Dim readArray As Byte() = Buf
- Do While _Stream.DataAvailable
- read = _Stream.Read(Buf, 0, Buf.Length)
- readArray(readArray.Length) = CByte(read)
- Loop
- Dim NewMessageArgs As New NewMessageEventargs(Me, readArray.ToArray)
- CrossThread.RunGui(AddressOf OnNewMessage, NewMessageArgs)
- Dim tempar(&H400 - 1) As Byte
- Buf = tempar
- _Stream.BeginRead(Buf, 0, Buf.Length, AddressOf EndRead, Nothing)
- End Sub
- Public Sub Dispose() Implements IDisposable.Dispose
- If _IsDisposed Then Return
- _IsDisposed = True
- DisposeAll(_Stream, _TcpClient)
- CrossThread.RunGui(AddressOf OnDisposed)
- GC.SuppressFinalize(Me)
- End Sub
- Public Sub [Stop]()
- Me.Dispose()
- End Sub
- Public Sub Start()
- If _TcpClient.Client.RemoteEndPoint.ToString = "" Then
- Throw New NullReferenceException("You tried to start an empty
- 'Client'-object. Please, use 'Sub New' and its overloads to create an
- instance of the class.")
- Else
- _Stream.BeginRead(Buf, 0, Buf.Length, AddressOf EndRead, Nothing)
- End If
- End Sub
- #Region "SendOverloads"
- Public Sub Send(ByVal Content As Byte())
- _Stream.Write(Content, 0, Content.Length)
- End Sub
- Public Sub Send(ByVal Content As String)
- Dim Buffer() As Byte = Encoding.UTF8.GetBytes(Content)
- Send(Buffer)
- End Sub
- #End Region
- #Region "Events"
- Private _IsDisposed As Boolean = False
- Public ReadOnly Property IsDisposed() As Boolean
- Get
- Return _IsDisposed
- End Get
- End Property
- Public Event Disposed(ByVal sender As Object)
- Protected Sub OnDisposed()
- RaiseEvent Disposed(Me)
- End Sub
- Public Event NewMessage(ByVal sender As Object, ByVal e As NewMessageEventargs)
- Protected Sub OnNewMessage(ByVal e As NewMessageEventargs)
- RaiseEvent NewMessage(Me, e)
- End Sub
- #End Region
- End Class
Settingsklasse
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Text
- Imports TCPAsynServer.EventArgs
- Imports System.Net
- Public Class CustomClientSettings
- Protected _Nickname As String
- Public Property Nickname As String
- Get
- Return _Nickname
- End Get
- Set(ByVal value As String)
- _Nickname = value
- End Set
- End Property
- Protected _IP As IPEndPoint
- Public ReadOnly Property getIP As String
- Get
- Return _IP.Address.ToString
- End Get
- End Property
- Public Property IP As IPEndPoint
- Get
- Return _IP
- End Get
- Set(ByVal value As IPEndPoint)
- _IP = value
- End Set
- End Property
- Protected _initialised As Boolean
- Public Property initialised As Boolean
- Get
- Return _initialised
- End Get
- Set(ByVal value As Boolean)
- _initialised = value
- End Set
- End Property
- End Class
EventArgs
VB.NET-Quellcode
- Public Class EventArgs
- Public Class NewMessageEventargs : Inherits EventArgs
- Public ReadOnly Message As Byte()
- Public ReadOnly Client As Client
- Public Sub New(ByVal sender As Client, ByVal Content() As Byte)
- MyBase.New()
- Me.Message = Content
- Me.Client = sender
- End Sub
- End Class
- Public Class ClientNewStatusEventArgs : Inherits EventArgs
- Public ReadOnly Client As Client
- Public Sub New(ByVal c As Client)
- MyBase.New()
- Me.Client = c
- End Sub
- End Class
- End Class
Server
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Net
- Imports TCPAsynServer.EventArgs
- Public Class Server
- Private _Listener As TcpListener
- Private _Clients As New List(Of Client)
- Public Sub New(ByVal EP As IPEndPoint)
- _Listener = New TcpListener(EP)
- _Listener.ExclusiveAddressUse = False
- End Sub
- Public Sub Start()
- _Listener.Start()
- _Listener.BeginAcceptTcpClient(AddressOf EndAccept, Nothing)
- End Sub
- Private Sub EndAccept(ByVal ar As IAsyncResult)
- If _IsDisposed Then Return
- Dim c As New Client(_Listener.EndAcceptTcpClient(ar))
- With c
- AddHandler .NewMessage, AddressOf Client_OnNewMessage
- AddHandler .Disposed, AddressOf Client_OnDispose
- _Clients.Add(c)
- Client_OnConnect(c)
- .Start()
- End With
- _Listener.BeginAcceptTcpClient(AddressOf EndAccept, Nothing)
- End Sub
- Protected Sub Dispose()
- _Listener.Stop()
- For i As Integer = _Clients.Count - 1 To 0 Step -1
- _Clients(i).Dispose()
- Next
- _IsDisposed = True
- CrossThread.RunGui(AddressOf OnDisposed)
- End Sub
- Public Sub [Stop]()
- Dispose()
- End Sub
- #Region "Server_Events"
- Private _IsDisposed As Boolean = False
- Public ReadOnly Property IsDisposed() As Boolean
- Get
- Return _IsDisposed
- End Get
- End Property
- Public Event Disposed(ByVal sender As Object)
- Protected Sub OnDisposed()
- RaiseEvent Disposed(Me)
- End Sub
- #End Region
- #Region "Client_Events"
- Public Event Client_Disposed(ByVal sender As Object, ByVal e As ClientNewStatusEventArgs)
- Protected Sub OnClient_Disposed(ByVal e As ClientNewStatusEventArgs)
- RaiseEvent Client_Disposed(Me, e)
- End Sub
- Public Event Client_Connected(ByVal sender As Object, ByVal e As ClientNewStatusEventArgs)
- Protected Sub OnClient_Connected(ByVal e As ClientNewStatusEventArgs)
- RaiseEvent Client_Connected(Me, e)
- End Sub
- Public Event Client_NewMessage(ByVal sender As Object, ByVal e As NewMessageEventargs)
- Protected Sub OnClient_NewMessage(ByVal e As NewMessageEventargs)
- RaiseEvent Client_NewMessage(Me, e)
- End Sub
- Protected Sub Client_OnDispose(ByVal sender As Object)
- CrossThread.RunGui(AddressOf OnClient_Disposed, New ClientNewStatusEventArgs(DirectCast(sender, Client)))
- End Sub
- Protected Sub Client_OnConnect(ByVal sender As Object)
- CrossThread.RunGui(AddressOf OnClient_Connected, New ClientNewStatusEventArgs(DirectCast(sender, Client)))
- End Sub
- Protected Sub Client_OnNewMessage(ByVal sender As Object, ByVal e As NewMessageEventargs)
- CrossThread.RunGui(AddressOf OnClient_NewMessage, e)
- End Sub
- #End Region
- End Class
Form1 (zum Testen des Codes)
VB.NET-Quellcode
- Imports System.Net
- Imports System.Text
- Public Class Form1
- Dim WithEvents s As Server
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- s = New Server(New System.Net.IPEndPoint(IPAddress.Any, 8900))
- s.Start()
- End Sub
- Private Sub s_Client_Connected(ByVal sender As Object, ByVal e As
- EventArgs.ClientNewStatusEventArgs) Handles s.Client_Connected
- StatusMessage("Client connected")
- e.Client.settingsObject = New CustomClientSettings
- DirectCast(e.Client.settingsObject, CustomClientSettings).IP =
- CType(e.Client.TcpClient.Client.RemoteEndPoint, Net.IPEndPoint)
- End Sub
- Private Sub s_Client_Disposed(ByVal sender As Object, ByVal e As
- EventArgs.ClientNewStatusEventArgs) Handles s.Client_Disposed
- Dim settings As CustomClientSettings = CType(e.Client.settingsObject, CustomClientSettings)
- StatusMessage(settings.Nickname & " disconnected")
- End Sub
- Private Sub s_Client_NewMessage(ByVal sender As Object, ByVal e As
- EventArgs.NewMessageEventargs) Handles s.Client_NewMessage
- Dim settings As CustomClientSettings = CType(e.Client.settingsObject, CustomClientSettings)
- Dim messageToString As String = Encoding.UTF8.GetString(e.Message)
- If settings.initialised = False Then
- Dim split() As String = messageToString.Split(CChar("|")) 'Später mache ich das dann mit Serialisierung
- settings.Nickname = split(0)
- settings.initialised = True
- e.Client.settingsObject = settings
- Else
- Dim nickname As String = settings.Nickname
- StatusMessage(nickname & ": " & messageToString) 'Ergebenis: nickname
- End If
- End Sub
- Private Sub s_Disposed(ByVal sender As Object) Handles s.Disposed
- StatusMessage("Server stopped")
- End Sub
- Private Sub StatusMessage(ByVal message As String)
- RichTextBox1.Text &= vbNewLine & message
- End Sub
- End Class
Wäre super, wenn mir jemand helfen könnte, da ich schon den ganzen Abend an diesem Problem hänge
Vielleicht ist der String ja einfach verflucht, wer weiß
MfG
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „schockerjo“ ()