Visual Basic TCP server/client Problem

...komplette Frage anzeigen

2 Antworten

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

Toraka 06.04.2014, 19:03

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
11Jonas11 06.04.2014, 19:06

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
Toraka 06.04.2014, 19:08
@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
11Jonas11 06.04.2014, 19:12
@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
Toraka 06.04.2014, 19:19
@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
Toraka 06.04.2014, 19: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
Toraka 09.04.2014, 21:49
@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
11Jonas11 11.04.2014, 20:17
@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
Toraka 12.04.2014, 00:28
@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
Toraka 12.04.2014, 00:44
@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.

Was möchtest Du wissen?