[VB.NET] Socket Programm friert ein

08/17/2014 17:07 TheBeanjay#1
Hey Leute,

Ich probiere mich seit ein paar Tagen an einem Socket Programm, jedoch habe Ich das Problem dass das Programm immer einfriert wenn Ich es starte. Im Internet bin Ich darauf gestoßen, es mit mehreren Threads zu lösen, aber auch das hat nicht funktioniert. Hat von euch jemand eine Idee was man da machen könnte?

Im Anhang findet ihr die beiden Projekte Server und Client.

Ihr würdet mir wirklich sehr weiter helfen.

Grüße,

TheBeanjay
08/17/2014 18:13 supercracker13#2
Also ich hab den code mal gerade überflogen. Bin jetzt auch nicht wirklich vb coder aber vlt kann ich trotzdem helfen.
Ich vermute dein Programm friert ein weil darauf gewartet wird das eine Nachricht ankommt und erst dann etwas passiert.
Dafür würde sich ein eigener thread eignen der Nachrichten empfängt.

Das Programm sieht mir nach nem copy paste aus such dir lieber ein tutorial auf YouTube die den code erklären nicht einfach einen code kopieren.

Außerdem würde ich dir utf8 als encoding empfehlen. Ascii hat seine Probleme mit Sonderzeichen und umbauten.
08/17/2014 18:31 TheBeanjay#3
Quote:
Originally Posted by supercracker13 View Post
Also ich hab den code mal gerade überflogen. Bin jetzt auch nicht wirklich vb coder aber vlt kann ich trotzdem helfen.
Ich vermute dein Programm friert ein weil darauf gewartet wird das eine Nachricht ankommt und erst dann etwas passiert.
Dafür würde sich ein eigener thread eignen der Nachrichten empfängt.

Das Programm sieht mir nach nem copy paste aus such dir lieber ein tutorial auf YouTube die den code erklären nicht einfach einen code kopieren.

Außerdem würde ich dir utf8 als encoding empfehlen. Ascii hat seine Probleme mit Sonderzeichen und umbauten.
Erstmal danke für deine Antwort :)

Der Code ist copy & paste da Ich nach einem Code gesucht hatte, wo das soweit funktioniert. Der Server war am Anfang eine Konsole, aber als Ich es in eine Windows Form umgeschrieben habe, ist es halt so komisch eingefroren und das selbe Problem habe Ich halt auch mit meinem ursprünglichem Programm. Ich weiß also auch was der Code tut, nur das mit dem Threading erschließt sich mir noch nicht völlig. Es ist aber auch allgemein unlogisch dass es jetzt in der Windows Form nicht mehr funktioniert.....

Von hier habe Ich die ursprüngliche Source (mit der Konsolen Application) gehabt: [Only registered and activated users can see links. Click Here To Register...]
08/17/2014 21:25 tooti#4
Dein Problem ist das der serverSocket.AcceptTcpClient() eine Blockende Funktion ist
Entweder Asynchron machen (serverSocket.AcceptTcpClientAsync()) oder überprüfen ob überhaupt Daten angefragt werden, so hab ich das Problem gelöst ([Only registered and activated users can see links. Click Here To Register...])
Der Code enthält noch weitere unzählige Fehler die du noch Fixen musst!
Bitte beachte, ich hab schon seit Ewigkeiten kein vb mehr benutzt
ps. lösche noch die Zeile " MsgBox("Client Connected")" vorher heraus xD , hab die vergessen zu entfernen D;
08/17/2014 22:26 'Heaven.#5
@Up, genau so sollte man es nicht machen.

Starte doch einfach einen neuen Thread, wo du alles drin behandelst. Jenachdem ob du was ausgeben möchtest musst du das jeweilige Control dann invoken
08/18/2014 12:20 TheBeanjay#6
@tooti Danke für deine Antwort, jetzt weiß Ich wo der Hund begraben liegt :) Wie funktioniert denn diese Async Methode?

Ich habe es jetzt mal so gemacht wie in deinem Vorschlag, es klappt auch alles Super außer das im Server nicht angezeigt wird wenn der Client etwas geschickt hat D: Ist das bei mir ein grundsätzlicher Fehler oder hat das damit zu tun? :D

@Heaven
Was genau soll Ich alles in nen Thread packen? D:
08/18/2014 14:24 'Heaven.#7
[Only registered and activated users can see links. Click Here To Register...]

So habe ich das irgendwann mal gemacht, ist sicher nicht die perfekte Lösung, aber klappt wunderbar und sauber
08/18/2014 14:26 TheBeanjay#8
Quote:
Originally Posted by 'Heaven. View Post
[Only registered and activated users can see links. Click Here To Register...]

So habe ich das irgendwann mal gemacht, ist sicher nicht die perfekte Lösung, aber klappt wunderbar und sauber
Wow, das verwirrt mich jetzt :D Was genau ist da für mich hilfreich, Ich will ja keine Daten aus nem Spiel auslesen oder was auch immer das ist :D
08/18/2014 14:52 'Heaven.#9
Das du eine Methode machst, in der du alles, was mit dem Socket zu tun hat behandelt.

Die Methode rufst du dann in einem neuem Thread auf.

[Only registered and activated users can see links. Click Here To Register...]

In Z.48-50 wird z.B. ein Thread genutzt, um die eingehenden Pakete zu lesen, in Z.52-54 werden die Pakete in einem neuem Thread behandelt. So blockiere diese sich nicht gegenseitig und können unabhängig voneinander arbeiten
08/18/2014 17:54 TheBeanjay#10
Ok Leute, es klappt jetzt alles soweit danke für eure Hilfe. Ich habe nur noch ein Problem auf eine Textbox zuzugreifen die in einem anderen Thread und einer anderen Klasse ist. Wenn da noch jemand einen hilfreichen Link oder eine Idee hätte, hätte Ich soweit keine Fragen mehr ^^
08/18/2014 18:12 'Heaven.#11
[Only registered and activated users can see links. Click Here To Register...]
08/19/2014 15:29 TheBeanjay#12
Quote:
Originally Posted by 'Heaven. View Post
[Only registered and activated users can see links. Click Here To Register...]
Danke, ich habe mich jetzt mal ein bisschen in das Invoken eingelesen und sorry wenn Ich noch mal nerve, aber Irgendwie funktioniert es immer noch nicht.

Hier der Code:
Code:
 Private Delegate Sub AppendTextBoxDelegate(ByVal TB As TextBox, ByVal txt As String)

    Private Sub AppendTextBox(ByVal TB As TextBox, ByVal txt As String)
        If TB.InvokeRequired Then
            TB.Invoke(New AppendTextBoxDelegate(AddressOf AppendTextBox), New Object() {TB, txt})
        Else
            TB.AppendText(txt)
        End If
    End Sub
Und so ruf Ich ihn auf:

Code:
AppendTextBox(Form1.TextBox2, serverResponse + vbCrLf)
Was mache Ich falsch :confused: ?
08/19/2014 15:50 tolio#13
nur am rande, ne textbox kannst du nicht per byval übergeben weil ein objekt eine referenz ist und kein value type, das sollte der compiler aber berichtigen

das gebilde was du dort gepostet hast funktioniert, aber nur wenn man es richtig verwendet. form1 ist ein typ und kein objekt, wenn du diesen code also aus dem aktuellen form1 objekt aufruftst, dann wird er funktionieren weil .net dann weiß das du das standartojekt meinst, wenn du ihn aber aus einer anderen klasse aufrust funktioniert er nicht mehr. das ganze ist eher weniger deine schuld, als die der .net entwickler die versucht haben winforms so einsteiger freundlich wie möglich zu machen und so einige fallen produziert haben.

also wenn der thread im aktuellen form1 objekt erzeugt und gestartet wird dann verwende Me. statt Form1. wenn das nicht der fall ist musst du eine referenz zur aktuellen Form1 haben und diese nutzen
08/19/2014 16:16 TheBeanjay#14
Quote:
Originally Posted by tolio View Post
nur am rande, ne textbox kannst du nicht per byval übergeben weil ein objekt eine referenz ist und kein value type, das sollte der compiler aber berichtigen

das gebilde was du dort gepostet hast funktioniert, aber nur wenn man es richtig verwendet. form1 ist ein typ und kein objekt, wenn du diesen code also aus dem aktuellen form1 objekt aufruftst, dann wird er funktionieren weil .net dann weiß das du das standartojekt meinst, wenn du ihn aber aus einer anderen klasse aufrust funktioniert er nicht mehr. das ganze ist eher weniger deine schuld, als die der .net entwickler die versucht haben winforms so einsteiger freundlich wie möglich zu machen und so einige fallen produziert haben.

also wenn der thread im aktuellen form1 objekt erzeugt und gestartet wird dann verwende Me. statt Form1. wenn das nicht der fall ist musst du eine referenz zur aktuellen Form1 haben und diese nutzen
Ok, das ist zwar verwirrend aber Ich glaube Ich verstehe ^^ Ich werde das mal ausprobieren, Vielen Dank :) Komischerweise wird mir das mit dem ByVal der TextBox überhaupt nicht als Fehler angezeigt, dem Compiler gefällt eigentlich alles soweit D: Wie kann man eine TextBox denn dann übergeben? Und eine Referenz ist
Code:
 Public form As New Form1
oder? Sorry wenn Ich so blöd Frage ^^
08/19/2014 22:16 'Heaven.#15
Wenn du in deiner Klasse(Form) bist, kannst du das Objekt direkt ansprechen, also einfach TextBox1


Finde es übrigens klasse, wie du dich anstrengst und dir die Sachen anschaust, nicht, wie der TE aus einem anderem Thread. So wird das auch was ;)