Frage zum TcpListener()

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Vainamo V.

    Frage zum TcpListener()

    Hallo zusammen,

    ich habe einen TCP Chat Programmiert, der auch soweit ganz gut läuft. Jetzt würde ich den Port aber gerne manuell vergeben wollen. Dazu habe ich mir eine TB definiert, die ich in int32 konvertiere.
    Und hier taucht jetzt das Problem auf, dass ich zuerst prüfen sollte ob eine Null vorhanden ist (Das sagt zumindest der Compiler). Gut dachte ich, habe dafür dann eine Methode definiert. Das löst allerdings nciht das Problem.

    Hat Jemand daher vllt eine Idee, wie ich den Port aus der Textbox dennoch nutzen kann?

    VB.NET-Quellcode

    1. Dim port As Int32
    2. Dim listener As New TcpListener(prüfeaufnull())
    3. Public Function prüfeaufnull()
    4. If TextBox2.Text <> 0 Then
    5. port = Convert.ToInt32(TextBox2.Text)
    6. Return port
    7. Else
    8. port = 8000
    9. Return port
    10. End If
    11. End Function


    Das ist der betreffende Code. Für Unterstützung bin ich sehr dankbar!

    VB.neter0101 schrieb:


    VB.NET-Quellcode

    1. Dim port As Int32
    2. Dim listener As New TcpListener(prüfeaufnull())
    3. Public Function prüfeaufnull()
    4. If TextBox2.Text <> 0 Then
    5. port = Convert.ToInt32(TextBox2.Text)
    6. Return port
    7. Else
    8. port = 8000
    9. Return port
    10. End If
    11. End Function


    Das ist der betreffende Code. Für Unterstützung bin ich sehr dankbar!


    Erstmal würde ich nicht prüfen ob der Wert der Textbox "ungleich" 0 ist sonder größer :D
    Wir wollen ja keine negativen Ports haben oder?...

    Dann würde ich dem TCP Listener erst in einer start() Methode erstellen und diesem dann den Port mitgeben und keine Function die im schlechtesten Fall einen negativen Port mitgibt.
    Die Dims stehen in der Klasse ganz am Anfang

    Ich packe hier mal gen ganzen Code rein:Das mit dem Start habe ich nicht so ganz verstanden...

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Imports System.Threading
    3. Imports System.Net.Sockets
    4. Public Class Form1
    5. Dim port As Int32
    6. Dim listener As New TcpListener(prüfeaufnull())
    7. Dim client As TcpClient
    8. Dim message As String
    9. Public Function prüfeaufnull()
    10. If TextBox2.Text > 0 Then
    11. port = Convert.ToInt32(TextBox2.Text)
    12. Return port
    13. Else
    14. port = 8000
    15. Return port
    16. End If
    17. End Function
    18. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    19. listener.Start()
    20. Dim listthread As New Thread(New ThreadStart(AddressOf listening))
    21. listthread.Start()
    22. End Sub
    23. Private Sub listening()
    24. listener.Start()
    25. End Sub
    26. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    27. listener.Stop()
    28. Application.Exit()
    29. End Sub
    30. Private Sub btnSendMsg_Click(sender As Object, e As EventArgs) Handles btnSendMsg.Click
    31. If rtbTextToSend.Text = "" Then
    32. MsgBox("Text eingeben!", MsgBoxStyle.Exclamation, "Text fehlt")
    33. Else
    34. Try
    35. client = New TcpClient(tbip.Text, prüfeaufnull())
    36. Dim writer As New StreamWriter(client.GetStream())
    37. writer.Write(rtbTextToSend.Text)
    38. rtbReceivedText.AppendText(Format(Now, "[dd.MM | hh:mm:ss]]") & TextBox1.Text & " schrieb: " & rtbTextToSend.Text & vbCrLf)
    39. rtbTextToSend.Clear()
    40. writer.Flush()
    41. Catch ex As Exception
    42. End Try
    43. Try
    44. rtbReceivedText.ScrollToCaret()
    45. rtbTextToSend.Text = ""
    46. SendKeys.Send("{BACKSPACE}")
    47. Catch ex As Exception
    48. End Try
    49. End If
    50. End Sub
    51. Private Sub tmrlistener_Tick(sender As Object, e As EventArgs) Handles tmrlistener.Tick
    52. If listener.Pending = True Then
    53. message = ""
    54. client = listener.AcceptTcpClient()
    55. Dim reader As New StreamReader(client.GetStream())
    56. While reader.Peek > -1
    57. message = message + Convert.ToChar(reader.Read()).ToString
    58. End While
    59. rtbReceivedText.AppendText(Format(Now, "[dd.MM | hh:mm:ss]]") & "Er/Sie: " & message & vbCrLf)
    60. If CheckBox1.Checked Then
    61. MsgBox(message, MsgBoxStyle.Information, "Du hast einen neue Benachrichtigung: ")
    62. End If
    63. End If
    64. End Sub
    65. Private Sub rtbTextToSend_KeyDown(sender As Object, e As KeyEventArgs) Handles rtbTextToSend.KeyDown
    66. If e.KeyCode = Keys.Enter Then
    67. Try
    68. rtbReceivedText.ScrollToCaret()
    69. Catch ex As Exception
    70. End Try
    71. btnSendMsg.PerformClick()
    72. rtbTextToSend.Text = ""
    73. SendKeys.Send("{BACKSPACE}")
    74. End If
    75. End Sub
    76. End Class

    Dann wird Dim listener As New TcpListener(prüfeaufnull()) ausgeführt ehe die Oberfläche erstellt wird, und die Textbox ist Nothing (null). Du musst den TcpListener initialisieren wenn du deine Textbox eingabe getätigt hast.

    VB.NET-Quellcode

    1. If TextBox2.Text <> 0 Then


    Funktioniert übrigens nicht da Text ein String ist und 0 ein Int.
    Vielleicht mit einem Button "Server starten" ?

    VB.NET-Quellcode

    1. Dim listener As New TcpListener(prüfeaufnull())
    2. 'wird dann zu
    3. Dim listener As TcpListener
    4. 'und im Button machst du dann
    5. listener As New TcpListener(Int32.Parse(Textbox1.Text))
    Gut:

    VB.NET-Quellcode

    1. Dim port As Int32
    2. 'Dim listener As New TcpListener(prüfeaufnull())
    3. Dim listener As TcpListener

    Check

    Neuen Button definiert:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. listener As New TcpListener(Int32.Parse(Textbox2.Text))
    3. End Sub

    Dort meckert er jetzt noch, Der Ausdruck ist keine Methde
    Danke, ich wollte eigentlich schon längst zurückgeschrieben haben, aber bei uns ist das Internet ausgefallen...

    Ich habe es heute morgen dann doch noch geschafft. Einfach die Sachen, die in der FormLoad waren in den neuen Button eingepackt und dann:
    listener = New TcpListener(Int32.Parse(Textbox2.Text)). Das passte somit. Ich habe es auch gleich getestet und alles läuft jetzt Super!

    Daher nochmal besten Dank an alle hier!
    Trotzdem wäre es hilfreich wenn du an den Codeanfang Option Strict On schreiben würdest. Und im nächsten Schritt dann das ganze als Standard festlegst, es gibt hier ein praktisches Tutorial dafür. Ich hab gerade nicht den Link parat aber ich wette @ErfinderDesRades hat dafür irgendne Liste wo die alle drinstehen :thumbsup: . Ach er hat ihn sogar schon gepostet.
    -> Visual Studio - Empfohlene Einstellungen