Probleme mit meinem Multi-Chat

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Probleme mit meinem Multi-Chat

    Guten Tag liebe Forumgemeinde,
    Ich habe gestern mir ein Chat-Tutorial von SemperVideo angesehen in dem ein Client-Server Chat, über TCP Sockets gebaut wird.

    Nun bin ich dabei einen Multichat zu bauen.
    Sprich:
    1 Client, mehrere Chatfenster zu mehreren IPs.

    Nun habe ich folgende Probleme:
    Problem 1:
    Wenn ich ein Chatfenster öffne bekomme ich die Meldung: "Es wird nicht abgehört. Rufen sie die Start()-Methode auf, bevor sie diese Methode aufrufen.

    Diese Meldung erscheint sporadisch, war aber auch schon bei der einfach Chatvariante (nur 1 Fenster) aufgetreten.

    Problem 2:
    Sobald ich ein 2. Fenster öffne bekomme ich den selben wie oben Erwähnt.

    Nur habe ich da noch das Vergnügen, dass das Programm auf Grund eines Problems beendet werden muss.(Komplett absturz)

    Kann es sein, dass diese TCPClient reader,writer geschichte nur 1x pro Port und IP funktioniert oder habe ich ein schwerwiegenderes Problem?

    Habt ihr vielleicht eine Idee, was man da machen kann?
    Ich bin mit meinem Latein vorerst am Ende.

    Über eine Antwort würde ich mich freuen.


    Ergänzende Infos zum Chat:
    Das komplette Chatfenster(Form, Buttons, Textfelder, TCP-Reader,-Writer, Threads etc) ist in einer Klasse namens "chatwindow", aus der jeweils ein neues Objekt(Mit der jeweiligen IP á la "dim win1 as new chatwindow("127.0.0.1")" ) erstellt wird.

    Mit freundlichen Grüßen,
    Sascha Laugwitz

    PS: Wenn der Code benötigt wird, kann ich den gerne anfügen.
    Hi ErfinderdesRades,
    durch deinen Chat blicke ich noch nicht ganz durch, da mir viele deiner verwendeten Objekte etc. nicht bekannt sind, da werde ich wohl noch die ein oder andere Minute dran übersetzen müssen.


    Hier aber erstmal mein Code(Das ist nur der Code von der Klasse "chatwindow" aus der die Chatfenster "generiert" werden, also nicht die Hauptform):

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Imports System.IO
    3. Imports System.Net.Sockets
    4. Public Class chatwindow
    5. Dim win As New Form With {.StartPosition = FormStartPosition.CenterScreen, .Width = 500, .Height = 500}
    6. Dim sendbtt As New Button With {.Anchor = AnchorStyles.Bottom + AnchorStyles.Right, .Text = "Senden", .Location = New Point(380, 360), .Width = 100, .Height = 100}
    7. Dim settext As New TextBox With {.Location = New Point(5, 360), .Multiline = True, .Width = 370, .Height = 100, .Anchor = AnchorStyles.Left + AnchorStyles.Bottom + AnchorStyles.Right}
    8. Dim ipbox As New TextBox With {.Location = New Point(60, 5)}
    9. Dim iplabel As New Label With {.Location = New Point(5, 6), .Width = 50, .Text = "User:"}
    10. Dim gettext As New System.Windows.Forms.RichTextBox
    11. Dim listener As New TcpListener(55555)
    12. Dim client As TcpClient
    13. Dim message As String = ""
    14. Dim Tmr As New System.Windows.Forms.Timer With {.Interval = 1}
    15. Dim cip As String = ""
    16. Sub New()
    17. win.Text = "Kein Titel"
    18. ipbox.Text = "Keine IP übergeben!"
    19. settext.Text = "Ungültiges Fenster, da keine Daten (Fehler: 0x2201)"
    20. settext.Enabled = False
    21. createwindow()
    22. End Sub
    23. Sub New(ByVal b As String, ByVal ip As String)
    24. win.Text = b
    25. cip = ip
    26. ipbox.Text = cip
    27. createwindow()
    28. End Sub
    29. Private Sub createwindow()
    30. AddHandler sendbtt.Click, AddressOf Button_Click
    31. AddHandler win.Load, AddressOf winload
    32. AddHandler win.FormClosing, AddressOf winclosing
    33. AddHandler Tmr.Tick, AddressOf ticking
    34. AddHandler gettext.LinkClicked, AddressOf clickedlink
    35. win.Show()
    36. win.Controls.Add(sendbtt)
    37. win.Controls.Add(settext)
    38. win.Controls.Add(ipbox)
    39. win.Controls.Add(iplabel)
    40. gettext.Location = New Point(5, 35)
    41. gettext.Width = 475
    42. gettext.Height = 290
    43. gettext.Anchor = AnchorStyles.Left + AnchorStyles.Bottom + AnchorStyles.Right + AnchorStyles.Top
    44. gettext.ReadOnly = True
    45. gettext.DetectUrls = True
    46. win.Controls.Add(gettext)
    47. End Sub
    48. Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs)
    49. Try
    50. client = New TcpClient(cip, 55555)
    51. Dim writer As New StreamWriter(client.GetStream())
    52. writer.Write(settext.Text)
    53. writer.Flush()
    54. Catch ex As Exception
    55. MessageBox.Show(ex.Message)
    56. End Try
    57. End Sub
    58. Private Sub winload(ByVal sender As Object, ByVal e As EventArgs)
    59. Dim liststhread As New Thread(New ThreadStart(AddressOf listening))
    60. liststhread.Start()
    61. Tmr.Enabled = True
    62. End Sub
    63. Private Sub winclosing(ByVal sender As Object, ByVal e As FormClosingEventArgs)
    64. Tmr.Enabled = False
    65. listener.Stop()
    66. End Sub
    67. Private Sub listening()
    68. listener.Start()
    69. End Sub
    70. Private Sub ticking(ByVal sender As Object, ByVal e As EventArgs)
    71. If listener.Pending = True Then
    72. message = ""
    73. client = listener.AcceptTcpClient()
    74. Dim reader As New StreamReader(client.GetStream())
    75. While reader.Peek > -1
    76. message = message + Convert.ToChar(reader.Read()).ToString
    77. End While
    78. gettext.Text = gettext.Text & message & vbCrLf & vbCrLf
    79. Else : End If
    80. End Sub
    81. Private Sub clickedlink(ByVal sender As Object, ByVal e As LinkClickedEventArgs)
    82. Dim oProcess As New Process
    83. oProcess = System.Diagnostics.Process.Start(e.LinkText)
    84. End Sub
    85. End Class



    Hier der Code der Hauptform:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub ContactBox_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ContactBox.DoubleClick
    3. If Not ContactBox.Text = "" Then
    4. Dim newWin As New chatwindow("Mein Neuer", ContactBox.Text)
    5. End If
    6. End Sub
    7. Private Sub Form1_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
    8. If Me.Width <= 300 And Me.Height <= 300 Then
    9. Me.Width = 300
    10. Me.Height = 300
    11. ElseIf Me.Width <= 300 Then
    12. Me.Width = 300
    13. ElseIf Me.Height <= 300 Then
    14. Me.Height = 300
    15. Else
    16. End If
    17. End Sub
    18. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    19. Dim a As New adder()
    20. 'Dim newWin1 As New chatwindow("Mein Neuer", "192.168.178.31", 55555)
    21. 'Dim newWin2 As New chatwindow("Mein Neuer", "127.0.0.1", 44444)
    22. End Sub
    23. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sascha3008“ ()

    Sascha3008 schrieb:

    da werde ich wohl noch die ein oder andere Minute dran übersetzen müssen.

    oh, oh - der ist eiglich ziemlich ausgefeilt. Wenn man den "übersetzt", baut man da meist nur Fehler oder mindestens Umständlichkeiten ein.
    Besonders originelle Objekte verwende ich doch garnet: TCPListener, TCPClient, IPEndPoint, NetStream - das sind doch alles Standard-Sachen, die man halt braucht für TCP, oder?
    über galileo äußere ich mich immer wieder gerne abfällig ;)

    Unds nützt nix - willste gscheit proggen, musstes lernen. Da ist vlt. der VersuchsChat kein schlechter Aufhänger.
    Man muß auch nicht alles kennen, am wichtigsten ist, dass man das VS kennt, dass man weiß, wie man es sich zunutze machen kann, wenn man beispielsweise das Stichwort "Stream" hingeschmissen bekommt.
    Weil Datenübertragung geht mit Streams.