Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

τι να χρησιμοποιήσω sync or async socket?

Îåêßíçóå áðü ôï ìÝëïò jimenez. Τελευταία δημοσίευση από το μέλος jimenez στις 10-09-2007, 18:14. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-09-2007, 13:56 34872

    τι να χρησιμοποιήσω sync or async socket?

    Καλημερα σε όλους,

       Θα ήθελα να ρωτήσω το εξής.Φτιάχνω μια εφαρμογή client η οποία θα συνδεέται με μία άλλη με socket. Αυτή η εφαρμογή ανα πάσα στιγμή θα δέχεται data από την υπάρχουσα server εφαρμογή. τι socket να χρησιμοποιήσω?σύγχρονο ή ασύγχρονο? 


    Dimitris S.
    FIRST TEST THEN CODE....
  •  09-09-2007, 14:13 34874 σε απάντηση της 34872

    Απ: τι να χρησιμοποιήσω sync or async socket?

    Με τα στοιχεία που μας δίνεις δεν είναι κι ότι πιο εύκολη η απάντηση, αλλά εφόσον υπάρχει "ανα πάσα στιγμή", προφανώς και ασύγχρονο, καθώς δεν θα ξέρεις ποτέ την στιγμή που ξεκινάει η μετάδοση. Δώσε μας παραπάνω πληροφορίες όμως. Τι είδους εφαρμογή είναι; Τι δεδομένα μεταφέρεις; Είναι δεδομένα μέσω Lan, μέσω Internet, και τα δύο; Κλπ κλπ.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  09-09-2007, 15:29 34877 σε απάντηση της 34874

    Απ: τι να χρησιμοποιήσω sync or async socket?

    Βασικά στον ίδιο υπολογιστή θα παίζουν οι δυο εφαρμογές.δυστυχώς η server εφαρμογή προυπηρχε.αλλιώς θα γινόταν με .net remoting,Τέλοςπάντων. Έχει να κάνει με δεδομένα που προορίζονται για αποθήκευση σε βάση. Τις περισσότερες φορές ξέρω πότε θα τα λάβω ,όταν εμφανίσω την τρίτη φόρμα. ενώ είναι στιγμές που θα δεχτώ απρόσμενα data. Κυρίως κάποιο error ή alarm.


    Dimitris S.
    FIRST TEST THEN CODE....
  •  09-09-2007, 15:36 34878 σε απάντηση της 34877

    Απ: τι να χρησιμοποιήσω sync or async socket?

    Ασύγχρονα θα έλεγα κι εγώ. Δες την μέθοδο BeginReceive στο socket objectWink

    Αν θες, επίσης, δες εδώ ένα ωραίο και κατατοπιστικό άρθρο
    http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c7695/


    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  09-09-2007, 19:19 34886 σε απάντηση της 34878

    Απ: τι να χρησιμοποιήσω sync or async socket?

    Ok.Παίζω με το παράδειγμα που μου έδειξες.Βασικά έχω ένα άλλο προβλημα. Έχω μια MainForm και την Κλαση socketclient. Στην mainForm έχω ένα richtextbox.OnData Receive (στην κλάση socketclient) έχω βάλει την εξής εντολή.

       richTextBox1.Text += szData; //szData είναι τα data που δέχομαι από τον server 

    Για περίεργο τρόπο (μάλλον έχω θολώσει από πολύ γράψιμο) δεν εμφανίζεται τίποτα στο richTextBox. Παρεπιπτόντως έχω δημιουργήσει και μια τοπική μεταβλητή με την οποία κάνω το ίδιο και σε debugging Που κάνω βλέπω τα data που λαμβάνω.


    Dimitris S.
    FIRST TEST THEN CODE....
  •  09-09-2007, 19:54 34888 σε απάντηση της 34872

    Απ: τι να χρησιμοποιήσω sync or async socket?

    Ασύγχρονη επικοινωνία μπορείς να πετύχεις και με σύγχρονα και με ασύγχρονα sockets. Μπορείς να δημιουργήσεις ένα ξεχωριστό thread το οποίο θα δημιουργεί το σύγχρονο thread. Ο προγραμματισμός του socket είναι ευκολότερος, καθώς απλά καλείς την Receive από το thread και το αφήνεις να περιμένει κάτι. Η επικοινωνία μεταξύ των thread είναι λίγο πιο περίπλοκη. Μπορείς να χρησιμοποιήσεις το BackgroundWorker component για να διευκολύνεις την επικοινωνία μεταξύ των thread, ή ... να διαβάσεις μερικά άρθρα για τη σωστή επικοινωνία μεταξύ thread.
    Τα ασύγχρονα sockets είναι πιο περίπλοκα στον προγραμματισμό τους, καθώς πρέπει να δημιουργήσεις διαφορετικές μεθόδους για να αρχίσεις να ακούς και να επεξεργαστείς τα δεδομένα. Επίσης, ο χειρισμός των exceptions είναι πιο δύσκολος, καθώς αυτά δεν θα εμφανιστούν μετά την BeginReceive αλλά όταν θα καλέσεις την EndReceive. Το καλό με τα ασύγχρονα sockets είναι ότι εκμεταλλεύονται την υποστήριξη των network drivers για ασύγχρονη επικοινωνία και έτσι δεσμεύουν πολύ λιγότερους πόρους από τα σύγχρονα.

    Η επιλογή σου θα πρέπει να βασιστεί στο ευκολότερος προγραμματισμός ή καλύτερη απόδοση? Ένα συχνό λάθος είναι να υπερεκτιμήσει κανείς τις ανάγκες για απόδοση και να ξοδέψει πολύ χρόνο για να πετύχει την αποδοτικότερη λύση σε λάθος σημείο. Για παράδειγμα, η βάση παίζει πολύ μεγαλύτερο ρόλο στην απόδοση από την επιλογή σύγχρονου/ασύγχρονου socket. Το σωστό transaction management είναι απείρως σημαντικότερο από την ταχύτητα που σου δίνει η μία ή η άλλη υλοποίηση των sockets.

    Θα κάνω και ένα τελευταίο σχόλιο όσον αφορά τη χρήση του .NET Remoting. Στην προ-WCF εποχή ο καλύτερος τρόπος να δημιουργήσεις εφαρμογές server ήταν να χρησιμοποιήσεις Enterprise Services. Αυτά σου παρείχαν υπηρεσίες διαχείρισης transaction, concurrency, security, object pooling κλπ. οι οποίες δεν ήταν διαθέσιμες στο .NET Remoting. Υπήρξε από την αρχή όμως η παρανόηση ότι επειδή τα Enterprise Services βασίζονταν στο COM+, θα ήταν προβληματικά σε περιβάλλον .ΝΕΤ. Φυσικά κάτι τέτοιο δεν συμβαίνει, αντίθετα μάλιστα, το .NET Remoting θεωρήθηκε προβληματικό σχεδόν από την αρχή. Εδώ και 4 χρόνια η Microsoft και οι ομιλητές σε ημερίδες και συνέδρια προτείνουν τα Web Services χρησιμοποιούνται για επικοινωνία μεταξύ διαφορετικών συστημάτων, τα Enterprise Services όταν απαιτούνται τα services που παρέχουν (transaction management, concurrecy, security) και το Remoting μόνο για επικοινωνία μεταξύ διαφορετικών εφαρμογών στο ίδιο μηχάνημα.

    Με την έλευση του WCF το .NET Remoting ουσιαστικά παροπλίζεται και οι εφαρμογές .NET Remoting θα χρειαστεί να ξαναγραφτούν αν θέλουν να εκμεταλλευτούν τις νέες δυνατότητες.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  09-09-2007, 20:02 34889 σε απάντηση της 34886

    Απ: τι να χρησιμοποιήσω sync or async socket?

    Να μαντέψω ότι δεν δουλεύεις σε .NET 2.0? Απαγορεύεται να καλέσεις ένα UI control από άλλο thread. Αν παίζεις με ασύγχρονα threads, η μέθοδος OnReceive (ή όπως αλλιώς την ονόμασες) εκτελείται σε άλλο thread. Αυτό θα σου δημιουργούσε compile error στο .NET 2.0 ενώ στο 1.1 απλά θα έχει περίεργη συμπεριφορά. Για να καλέσεις μέθοδο σε UI control θα πρέπει να φτιάξεις μία άλλη μέθοδο την οποία θα καλέσεις μέσω της BeginInvoke από την OnReceive.

    Δες το http://www.codeproject.com/csharp/begininvoke.asp το οποίο εξηγεί τα τί και πως της BeginInvoke και έχει και ένα παράδειγμα πως να καλέσεις ένα control από άλλο thread.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-09-2007, 18:14 34908 σε απάντηση της 34889

    Απ: τι να χρησιμοποιήσω sync or async socket?

    Σε .net 2.0 παίζω, αυτό είναι. Μου χτυπάει και μου λέει για το thread. Επί της ουσίας έχω αυτό αυτό το κομμάτι κώδικα στην On DataReceive. Οπότε τι να κάνω?

    public void OnDataReceived(IAsyncResult asyn)
        {
          try
          {
            SocketPacket theSockId = (SocketPacket)asyn.AsyncState ;
            int iRx = theSockId.thisSocket.EndReceive (asyn);
            char[] chars = new char[iRx + 1];
            System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
            szData = new String(chars);
       
            _paymentform.richTextBox1.Text = _paymentform.richTextBox1.Text +szData;

            WaitForData();
          }
          catch (ObjectDisposedException )
          {
            //System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
          }
          catch(SocketException se)
          {
            MessageBox.Show (se.Message );
          }
        }  

    //Please Help!!!


    Dimitris S.
    FIRST TEST THEN CODE....
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems