Visual Basic TCP server/client Problem

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Etwas grundsätzliches. Du möchtest über TCP/IP Daten senden/empfangen, so ist es doch, nicht wahr!? Warum verwendest du nicht einen Lösung, die mit asynchronen Methoden arbeitet? Die also beispielsweise ein Event auslösen, dass Daten vorhanden sind oder gesendet wurden!? In diesem Event kannst du unter anderem auswerten, ob ein Fehler aufgetreten ist. In C# verwende ich dafür einen WebClient, eine solche Klasse gibt es in VB.NET unter gleichlautenden Namen. Siehe hier:

http://msdn.microsoft.com/de-de/library/system.net.webclient%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

24

Die Wahl der richtigen Klasse hängt vor allem davon ab, was du überhaupt vor hast. Möchtest du gezielt Daten empfangen und senden? Oder möchtest du warten, dass Daten eintrudeln, wie etwa in einem Chatprogramm?

0
7

aber so wie ich die Klasse sehe, ist das ein WEB client, also für HTTP?! oder irrre ich mich da jetzt?

Die Wahl der richtigen Klasse hängt vor allem davon ab, was du überhaupt vor hast. Möchtest du gezielt Daten empfangen und senden? Oder möchtest du warten, dass Daten eintrudeln, wie etwa in einem Chatprogramm?

letzteres, auch wenn nicht als chatprogramm-

0
24
@11Jonas11

Es ist nicht zu erkennen, welche Klasse du verwendest, weil der Teil fehlt. Es sieht aber nach einem TCPClient aus.

Ich schätze, es werden einfach keine Daten ankommen, deshalb bleibt das Peek des Streams hängen!?

0
7
@Toraka

Richtig.

Dim stream As NetworkStream Dim streamw As StreamWriter Dim streamr As StreamReader Dim Client As New TcpClient

TCP!

genau, das ist das problem, aber wie kann ich das mit handlern oder events oder so machen?

0
24
@11Jonas11

Wenn du bei dem bleiben willst, was du hast, könntest du einen separaten Thread verwenden, etwa einen BackgroundWorker.

Ich empfehle dir, einfach mal hier rein zu schauen, Codeproject hat immer gute Lösungen, insgesamt abgerundet und vor allem funktionieren:

http://www.codeproject.com/Articles/38914/A-TCP-IP-Chat-Program

Als ich drüber schaute, habe ich gesehen, dass auch hier ein separater Thread verwendet wird. Du kannst das gesamte Beispielprojekt herunter laden. Um Viren musst du dir keine Sorgen machen, Codeprojekt ist in Ordnung. Allerdings wirst du dich für den Download anmelden müssen, was aber kein Problem darstellen wird.

0
24
@Toraka

Ich sehe gerade, der Beispielcode verwendet mal wieder eine extra DLL. Das hasse ich immer, da die Prozesse innerhalb der DLL verborgen bleiben, und schließlich möchtest du etwas dazulernen, davon gehe ich aus. Nichtsdestotrotz kannst du am Code auf der Seite schon einiges erkennen. Auf die DLL würde ich persönlich aber verzichten. Es gibt unzählige Beispiele im Netz, du musst einfach nur nach VB NET und Chat suchen. Hier wirst du schnell fündig, wie dein wartender Listener bedient werden muss, damit alles einwandfrei funktioniert. Einen Chat musst du daraus nicht machen. Wichtig halte ich hauptsächlich den separaten Thread, da ansonsten alles im Hauptthread hängen bleibt.

0
24
@11Jonas11

Danke für deine Rückmeldung!

Wie hast du es denn nun realisiert? Hast du dir einen Thread erstellt oder hast du die asynchronen Methoden einer Netz-Klasse verwendet, und wenn ja, welche Klasse?

0
7
@Toraka

Danke, der tipp mit dem 2. Thread hats gebracht, ich habe den Timer durch einen BackgroundWorker ersetzt, in dem ich eine While-schleife laufen lasse:

Private Sub BackgroundWorker3_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker3.DoWork While jamm = True system.threading.thread.sleep(4000) 'aktion' End While Form2.Close() End Sub

//Edit: ich krieg die CodeFormatierung irgendwie nicht hin ;( xD

0
24
@11Jonas11

Um Code als solches zu formatieren, muss lediglich jede Zeile um vier Leerzeichen nach rechts eingerückt werden. Dazu ein paar weitere Einrückungen und Absätze und es wird lesbar.

Private Sub BackgroundWorker3_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker3.DoWork 

While jamm = True 
  system.threading.thread.sleep(4000) 'aktion'
End While 

Form2.Close() 

End Sub
0
24
@Toraka

Ich fragte mich gerade, was der Vorgang überhaupt bezwecken soll. Die Schleife mit Pause in Form eines Sleep kam mir völlig sinnfrei vor. Bis ich das 'aktion' interpretierte. An dieser Stelle kommt also die Funktionalität für das Web. Du tätigst hier also ein Peek? Die empfangenen Daten könntest du in einen modular gültigen String hinterlegen. Denn aus dem Thread heraus kannst du auf die Controls des Haupt-Threads nicht zugreifen, ohne dass ein Invoke oder eben eine Variable als Schnittstelle verwendet wird. Ein Timer im Form könnte dann den String auf neue Daten prüfen. Eine Lösung über ein Invoke ginge auch, ich persönlich halte davon aber nicht viel. Was in einem Thread ist, sollte auch alleinig von dort bedient werden. Der modulare String könnte zur Sicherheit mit Hilfe eines Objekts gelockt werden, so dass alles 100% abgesichert ist, falls irgendwann eine Änderung erfolgt, wodurch beide Threads auf den String schreibend zurückgreifen, was aber eher unwahrscheinlich ist.

0

Ich kann dir (noch nicht) helfen, warum es hängen bleibt. Doch kann ich dir schon mal mitteilen, dass der Timer gestartet wird. Nur bleibt alles bei der von dir benannten Zeile hängen und nichts geht mehr. Es gilt also, herauszufinden, warum es hängen bleibt.

During / While Englisch?

Wann benutze ich was?

...zur Frage

wie kann man in Visual Basic eine Zeile in einer Text Datei Kopieren und als Variable Speichern?

Guten abend,

Ich möchte ein Programm schreiben, welches ein bestimmtes Wort in einer Textdatei sucht und dann die ganze Zeile Kopiert, um sie dann in einer neuen Datei zu schreiben. Ich habe bereits alles zusammengesammelt, nur fehlt mir der Code zum Kopieren von der Zeile. Der aktuelle Code lautet:

    Dim sr1 As New System.IO.FileStream("Verzeichnis1", IO.FileMode.Open, IO.FileAccess.Read)
    Dim reader1 As New System.IO.StreamReader(sr1)

    Do Until reader1.EndOfStream

        Dim line As String = reader1.ReadLine

        If line.Contains("Gruenkohl") = True Then TextBox("Gefunden!")

        ' Fehlt noch...


        Using StrWriter As New IO.StreamWriter("Verzeichnis2")
            StrWriter.WriteLine("Gefunden") 'Das ist die erste Zeile.
        End Using
        MsgBox("Gefunden!")



    Loop

End Sub

MfG Linus

...zur Frage

Visual Basic TCP / Prozess mit Netzwerk Aktivitäten

Hallo zusammen,

ich suche nach einem Weg die TCP verbindungen eines bestimmten Ports (oder auch eines Prozesses) zu zählen.

Also z.b. wie beim Ressourcen Monitor, dann wähle ich den Prozess aus und sehe bei den TCP Connections die aktiven Verbindungen.

Diese möchte ich in einer Liste haben bzw optimal wäre, wenn ich diese zählen könnte und dann in einem Label ausgeben könnte.

Z.b. in einem Timer der jede Minute Label1 aktualisiert mit tcpConnections.Count() oder so eine Fantasie sache.

Ich finde zu dem Thema einfach nichts im Netz und hoffe, mir kann jemand helfen. Optimal wäre ein source code und eine kurze erklärung zu relevanten Funktionen. & Falls es nicht möglich ist, gibt es eine, für meine Lage, gute ausweichmöglichkeit?

Noch zur Info:

Ich habe das Programm schon in Visual Basic stehen und möchte jetzt auch nicht von neu anfangen in einer anderen Programmiersprache.

Danke :)

...zur Frage

VB.NET Controls threadübergreifend ansprechen?

Hallo liebe Gutefrage.net-Community.

Bei meinem aktuellen VB.NET-Projekt (Server-Client-Chat) habe ich das Problem, dass ich aus der Sub, welche in einem separaten Thread ausgeführt wird, um eingehende Verbindungen abzufangen, der Listbox, die zur Anzeige für alle Aktionen des Server dient, beim Items hinzufügen die Fehlermeldung bekomme, dass die Listbox für einen anderen Thread erstellt worden ist.

Code des Extra-Threads:

Private Sub ListenToNewConnection()
  Item_add("Der Server läuft!")
  server = New TcpListener(ipendpoint)
  server.Start()

  While True
    client = server.AcceptTcpClient
    Dim c As New Connection connection...
    c.stream = client.GetStream
    c.streamr = New StreamReader(c.stream)
    c.streamw = New StreamWriter(c.stream)
    c.nick = c.streamr.ReadLine
    list.Add(c) ' und fügen sie der liste der clients hinzu.
    Item_add(c.nick & " has joined.")
    Dim t As New Threading.Thread(AddressOf ListenToConnection)
    t.Start(c)
  End While

Listbox-Aufruf:

Public Sub Item_add(item As String)
  lbConsole.Items.Add(item)
End Sub

Danke im Voraus für alle Antworten.

...zur Frage

Discord Bot vb.NET?

Hey Leute :)

Ich habe vor mein eigenen Discord Bot zu erstellen, habe auch schon einen "erschaffen" in Javasprache. Dennoch kann er nix, weil ich keine Javasprache beherrsche. Es gibt ein Tutorial auf YouTube wie man einen Bot in vb.NET schreiben kann.

Soweit so gut, aber sobald ich ihn starte, kommt ein Fehler (Screens) (Code weiter unten)

Vielleicht kennt sich jemand gut aus, bitte um Hilfe :) ~ Maurice

Imports Discord
Imports Discord.Commands
Public Class Form1

    Dim WithEvents discord As DiscordClient

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Try
            discord.Connect("TOKEN ....", TokenType.Bot)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub
End Class
...zur Frage

Kann man ein zweites SELECT statement in einem while loop ausführen?

Hallo,

meine Frage ist einfach:

$sql = "SELECT DISTINCT gruppeid FROM users";
    $result = $con->query($sql);
    while ($row = $result->fetch_assoc()) {
                    .............
    }

ich muss eigentlich in meinem loop spalten aus einer anderen Tabelle mit dieser gruppeid zählen. Aber immer wenn ich in den loop ein weiteres (SELECT...) schreibe und dieses danach einfach erstmal nur abfragen will bekomme ich diesen Fehler: Call to a member function fetch_assoc() on boolean. Deswegen meine Frage, kann man überhaupt in dem loop noch ein SELECT statement schreiben? Und wenn ja, dann wie?

Ich würde mich über eine Antwort freuen ;) schönen Tag noch

...zur Frage

Was möchtest Du wissen?