TCP Problem

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    so, wie connectest du denn? Und mit diesem ist die Verbindung noch nicht geschlossen, du schließt dabei nur die Kommunikationsverbindung zwischen dem TCP Stream und deiner Application, um die Verbindung wirklich zu schließen musst du auch den NetworkStream schließen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    du meinst du hast den Code nur abkopiert und kannst mir nichtmal den Code zeigen, mit welchem du Connectest geschweige denn weißt du was davon der NetworkStream ist...

    Private stream As NetworkStream
    das war aber schwer zu finden...und diesen musst du beim Disconnect des Clients als allererstes schließen...(ink. Streamreader/writer)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Es ist nicht schlimm, dass du diesen Code als Basis verwendest, es ist nur schlimm, wenn du ihn verwendest, bevor du ihn verstehst und zwar jede einzelne Zeile davon, sonst kannst du dir meistens Sicher sein, dass das entsprechende Umformen nicht funktioniert und Fehler aufweist...

    Edit: Was geht nicht? Warum geht es nicht? Und ich habe immer noch keinen fetzen Code gesehen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Auf das verworfene Objekt kann nicht zugegriffen werden. Objektname: "System.Net.Sockets.NetworkStream".

    Ich lese mir denn Code durch, muss ich ja wenn ich ihn verändere. Kann nur sein das ich mal was überfliege.

    Client:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Public Class Form1
    4. Private stream As NetworkStream
    5. Private streamw As StreamWriter
    6. Private streamr As StreamReader
    7. Private client As New TcpClient
    8. Private t As New Threading.Thread(AddressOf Listen)
    9. Private Delegate Sub DAddItem(ByVal s As String)
    10. Private nick As String = ""
    11. Dim sendung As String = ""
    12. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    13. Dim info As Integer = "0"
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. End Sub
    16. Private Sub AddItem(ByVal s As String)
    17. End Sub
    18. Private Sub connect()
    19. info = "0"
    20. Try
    21. client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen.
    22. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
    23. If client.Connected Then
    24. stream = client.GetStream
    25. streamw = New StreamWriter(stream)
    26. streamr = New StreamReader(stream)
    27. streamw.WriteLine(nick) ' das ist optional.
    28. streamw.Flush()
    29. t.Start()
    30. Else
    31. MessageBox.Show("Verbindung zum Server nicht möglich!")
    32. End If
    33. Catch ex As Exception
    34. MessageBox.Show("Verbindung zum Server nicht möglich!")
    35. End Try
    36. End Sub
    37. Private Sub Listen()
    38. While client.Connected
    39. Try
    40. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
    41. Catch
    42. If info = "1" Then
    43. ElseIf info = "0" Then
    44. MessageBox.Show("Verbindung zum Server nicht möglich")
    45. Application.Exit()
    46. End If
    47. End Try
    48. End While
    49. End Sub
    50. Private Sub send()
    51. streamw.WriteLine(sendung)
    52. streamw.Flush()
    53. sendung = ""
    54. End Sub
    55. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    56. nick = TextBox1.Text
    57. sendung = TextBox1.Text & ";" & TextBox2.Text & ":"
    58. connect()
    59. send()
    60. Button1.Enabled = False
    61. End Sub
    62. Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
    63. reg.Show()
    64. End Sub
    65. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    66. If My.Settings.newaccount = "" Then
    67. Else
    68. sendung = My.Settings.newaccount
    69. My.Settings.newaccount = ""
    70. My.Settings.Save()
    71. nick = "reg"
    72. connect()
    73. send()
    74. info = "1"
    75. Sleep(1000)
    76. client.Close()
    77. stream.Close()
    78. End If


    Server is der selbe code
    und in welcher Zeile kommt der Code und nach welcher Aktion?


    Ich lese mir denn Code durch, muss ich ja wenn ich ihn verändere. Kann nur sein das ich mal was überfliege.

    das Überfliegen würde ich mir abgewöhnen, da sich dort meistens der Fehler verbirgt...

    Edit: wie bereits gesagt stream.Close() muss vor client.Close(), da die Verbindung zu den Objekten durch client.Close() geshclossen wird und du somit keinen Zugriff mehr darauf hast...(aber warum in einem Timer die Verbindung schließen? Um sie etwa später wieder zu öffnen? Dann lieber direkt offen lassen)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Der timer soll denn Client aufm Server ein Account erstellen, da er es aus My.settings holt deshalb timer. Verbindung muss unterbrochen werden weil der Client sich mit denn nick: reg anmeldet damit der server weis er soll ein account erstellen. Und nacher sich halt mit denn Username anmeldet.

    Wenn ich das sub send ansteuere, krieg ich ein error:

    VB.NET-Quellcode

    1. Private Sub send()
    2. streamw.WriteLine(sendung)
    3. streamw.Flush() 'Auf das verworfene Objekt kann nicht zugegriffen werden. Objektname: "System.Net.Sockets.NetworkStream".
    4. sendung = ""
    5. End Sub