Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > .NET Languages
You last visited: Today at 13:43

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[VB.NET] Socket Programm friert ein

Discussion on [VB.NET] Socket Programm friert ein within the .NET Languages forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Feb 2013
Posts: 62
Received Thanks: 5
[VB.NET] Socket Programm friert ein

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
Attached Files
File Type: zip Client.zip (164.9 KB, 13 views)
TheBeanjay is offline  
Old 08/17/2014, 18:13   #2
 
elite*gold: 0
Join Date: Nov 2010
Posts: 700
Received Thanks: 507
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.
supercracker13 is offline  
Old 08/17/2014, 18:31   #3
 
elite*gold: 0
Join Date: Feb 2013
Posts: 62
Received Thanks: 5
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:
TheBeanjay is offline  
Old 08/17/2014, 21:25   #4
 
tooti's Avatar
 
elite*gold: 18
Join Date: Jun 2009
Posts: 1,089
Received Thanks: 301
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 ()
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;
tooti is offline  
Old 08/17/2014, 22:26   #5
 
'Heaven.'s Avatar
 
elite*gold: 1
The Black Market: 331/0/0
Join Date: Jun 2012
Posts: 5,819
Received Thanks: 3,200
@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
'Heaven. is offline  
Old 08/18/2014, 12:20   #6
 
elite*gold: 0
Join Date: Feb 2013
Posts: 62
Received Thanks: 5
@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?

@Heaven
Was genau soll Ich alles in nen Thread packen? D:
TheBeanjay is offline  
Old 08/18/2014, 14:24   #7
 
'Heaven.'s Avatar
 
elite*gold: 1
The Black Market: 331/0/0
Join Date: Jun 2012
Posts: 5,819
Received Thanks: 3,200


So habe ich das irgendwann mal gemacht, ist sicher nicht die perfekte Lösung, aber klappt wunderbar und sauber
'Heaven. is offline  
Old 08/18/2014, 14:26   #8
 
elite*gold: 0
Join Date: Feb 2013
Posts: 62
Received Thanks: 5
Quote:
Originally Posted by 'Heaven. View Post


So habe ich das irgendwann mal gemacht, ist sicher nicht die perfekte Lösung, aber klappt wunderbar und sauber
Wow, das verwirrt mich jetzt Was genau ist da für mich hilfreich, Ich will ja keine Daten aus nem Spiel auslesen oder was auch immer das ist
TheBeanjay is offline  
Old 08/18/2014, 14:52   #9
 
'Heaven.'s Avatar
 
elite*gold: 1
The Black Market: 331/0/0
Join Date: Jun 2012
Posts: 5,819
Received Thanks: 3,200
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.



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
'Heaven. is offline  
Old 08/18/2014, 17:54   #10
 
elite*gold: 0
Join Date: Feb 2013
Posts: 62
Received Thanks: 5
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 ^^
TheBeanjay is offline  
Old 08/18/2014, 18:12   #11
 
'Heaven.'s Avatar
 
elite*gold: 1
The Black Market: 331/0/0
Join Date: Jun 2012
Posts: 5,819
Received Thanks: 3,200
'Heaven. is offline  
Old 08/19/2014, 15:29   #12
 
elite*gold: 0
Join Date: Feb 2013
Posts: 62
Received Thanks: 5
Quote:
Originally Posted by 'Heaven. View Post
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 ?
TheBeanjay is offline  
Old 08/19/2014, 15:50   #13
 
tolio's Avatar
 
elite*gold: 2932
The Black Market: 169/1/0
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
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
tolio is offline  
Old 08/19/2014, 16:16   #14
 
elite*gold: 0
Join Date: Feb 2013
Posts: 62
Received Thanks: 5
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 ^^
TheBeanjay is offline  
Old 08/19/2014, 22:16   #15
 
'Heaven.'s Avatar
 
elite*gold: 1
The Black Market: 331/0/0
Join Date: Jun 2012
Posts: 5,819
Received Thanks: 3,200
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
'Heaven. is offline  
Reply


Similar Threads Similar Threads
Socket ID von einem Programm herausfinden , über die verbunden wird ?
08/29/2011 - General Coding - 7 Replies
Also ich habe ein kleines Problem : Ich möchte die Socket ID , von z.b. Firefox.exe herausfinden , über die es mit dem Internet verbunden ist . WPE kann es ja anzeigen , aber ich kann den Benutzer schlecht jedesmal auffordern , dass er erst mit WPE die Socket Id herausfinden soll und danach diese eingeben soll . Also ich nehmen gerne Beispiele in folgenden Sprachen entgegen : C++ C Visual basic AutoIT ( Eher unwarscheinlich , dass es etwas derartiges ohne Dlls gibt)



All times are GMT +2. The time now is 13:43.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.