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

 

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

Socket Multithreading και Functions

Îåêßíçóå áðü ôï ìÝëïò ntaryl. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 02-07-2010, 21:11. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-04-2010, 22:12 57932

    Socket Multithreading και Functions

    Καλησπερα 

    Παλι θα μιλησουμε  για  Multithreading  

    Ισως  πει καποιος  οτι δεν υποστηριζει  αλλα τελικα με χρηση καποιου  extra Activex  ειναι αρκετα ευκολο 

    Αυτο που  θελω  να  μαθω  ειναι  την λογικη πισω απο  το socket  Multithreading  

    Ανοιγουμε   νεο thread και για το  Socket  που κανει listening   ?

    Οταν δεχομαστε συνδεσεις σε  καθε  νεο πελατη ανοιγουμε  νεο thread ?

    Ανοιγουμε  νεο  και  οταν κανουμε  send Receive ?

    ευχαριστω πολυ  και καλο  βραδυ    



    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  03-04-2010, 02:24 57933 σε απάντηση της 57932

    Απ: Socket Multithreading και Functions

    ntaryl:

    Καλησπερα 

    Παλι θα μιλησουμε  για  Multithreading  

    Ισως  πει καποιος  οτι δεν υποστηριζει  αλλα τελικα με χρηση καποιου  extra Activex  ειναι αρκετα ευκολο 

    Αυτο που  θελω  να  μαθω  ειναι  την λογικη πισω απο  το socket  Multithreading  

    Ανοιγουμε   νεο thread και για το  Socket  που κανει listening   ?

    Οταν δεχομαστε συνδεσεις σε  καθε  νεο πελατη ανοιγουμε  νεο thread ?

    Ανοιγουμε  νεο  και  οταν κανουμε  send Receive ?

    ευχαριστω πολυ  και καλο  βραδυ    


    Καλό είναι ότι έχεις εμμονές Μ. Παρασκευή βράδυ, το κακό είναι ότι τις έχεις με την VB6 - ότι και να κάνεις, ότι και να βρεις, να είναι γραμμένο σε οποιαδήποτε γλώσσα που υποστηρίζει COM, και το καλέσεις μέσα από VB6 θα έχεις 1 νήμα, άρα το πρόγραμμά σου θα εκτελεί κώδικα σε ένα σημείο κάθε φορά. Αν προσπαθήσεις να χακάρεις την VB6 για να μπορέσει να εκτελέσει παράλληλα threads, αυτό που καταφέρεις είναι να κρασάρεις το VB6 IDE και να μην μπορείς να κάνεις compile και debug.

    Οπότε αν η δημιουργία ενός thread είναι περιοριστικό για σένα, καλό θα ήταν να αρχίσεις να κοιτάς κάποια άλλη γλώσσα προγραμματισμού που θα δεν θα σε περιορίζει. Δεν έχει νόημα, να εύχεσαι να γίνει multithreading η VB6, κάτι που το έκαναν πριν από σένα εκατοντάδες χιλιάδες προγραμματιστών ανά τον κόσμο, και ποτέ δεν ικανοποιήθηκε η επιθυμία τους. Αν η VB6 είναι περιοριστικός παράγοντας για εσένα, θα πρέπει να γίνεις καλύτερος προγραμματιστής - καλύτεροι αλγόριθμοι, αποφυγή tight loops, χρήση event driven programming, είναι αυτά που θα σε βοηθήσουν.

    Αν δεχτείς ότι πρέπει να πάψεις να εύχεσαι multitasking σε VB6, και πιστέψεις ότι μπορείς να το καταφέρεις με τους περιορισμούς της VB6, είμαι σίγουρος ότι θα βρεις την λύση που χρειάζεσαι, όπως και εκατομμύρια προγραμματιστές VB6...

    Το παρακάτω είναι ο κώδικας που έγραψα για ένα προγραμματάκι που διαβάζει ένα text αρχείο από το δίσκο και το στέλνει γραμμή-γραμμή σε όσους clients είναι συνδεδεμένοι μαζί του, μέσα από WinSock. Αυτό που σε ενδιαφέρει είναι να δεις πως εγώ χειρίζομαι τα εισερχόμενα connections και πως τα δέχομαι.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    Option Explicit
    Private fileObject As Scripting.FileSystemObject
    Private winSocketCollection As Scripting.Dictionary
    Private IsRunning As Boolean
    
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Private Sub cmdSelectFile_Click()
        commonDialog.DialogTitle = "ÅðéëÝîôå Ýíá áñ÷åßï êåéìÝíïõ"
        commonDialog.InitDir = App.Path
        commonDialog.Flags = cdlOFNFileMustExist
        commonDialog.Filter = "Log Files (*.log)|*.log|Text Files (*.txt)|*.txt|All Files (*.*)|*.*"
        commonDialog.FilterIndex = 0
        commonDialog.ShowOpen
        If commonDialog.FileTitle <> vbNullString Then
            txtFileName.Text = commonDialog.FileName
            
        End If
        
    End Sub
    
    Private Sub cmdStart_Click()
    Dim fileStream As Scripting.TextStream
    Dim sLines() As String
    Dim currentLine As Long
    Dim currentWinsock As Variant
    
        If Not fileObject.FileExists(txtFileName.Text) Then
            MsgBox "ÐñÝðåé íá åðéëÝîåôå Ýíá áñ÷åßï äåäïìÝíùí ðñþôá!", vbCritical Or vbOKOnly, "ÓöÜëìá"
            Exit Sub
        End If
    
        Set fileStream = fileObject.OpenTextFile(txtFileName.Text, ForReading, False, TristateUseDefault)
        sLines = Split(fileStream.ReadAll, vbCrLf)
        fileStream.Close
        Set fileStream = Nothing
    
        cmdStart.Enabled = False
        cmdStop.Enabled = True
        theTimer.Interval = 1000
        theTimer.Enabled = True
        IsRunning = True
        
        currentLine = 0
        Do While IsRunning
            lblStatus.Caption = sLines(currentLine)
            For Each currentWinsock In winSocketCollection.Keys
                Call winSock(winSocketCollection(currentWinsock)).SendData(sLines(currentLine) & vbCrLf)
                Call Sleep(100)
            Next
            DoEvents
            currentLine = IIf(currentLine + 1 < UBound(sLines), currentLine + 1, 0)
            txtStatus.Text = CStr(currentLine)
        Loop
        
        theTimer.Enabled = False
        
        cmdStop.Enabled = False
        cmdStart.Enabled = True
    
    End Sub
    
    Private Sub cmdStop_Click()
        IsRunning = False
        
    End Sub
    
    Private Sub Form_Initialize()
        Set fileObject = New Scripting.FileSystemObject
        Set winSocketCollection = New Scripting.Dictionary
        
        IsRunning = False
        cmdStart.Enabled = True
        cmdStop.Enabled = False
        
        winSock(0).LocalPort = 1001
        winSock(0).Listen
        
    End Sub
    
    Private Sub Form_Load()
        txtFileName.Text = GetSetting(Me.Name, "Settings", "path", vbNullString)
    
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
    Dim currentWinsock As Variant
    
        IsRunning = False
        For Each currentWinsock In winSocketCollection.Keys
            Call winSock(winSocketCollection(currentWinsock)).Close
            Unload winSock(winSocketCollection(currentWinsock))
        Next
        
        If txtFileName.Text <> vbNullString Then
            Call SaveSetting(Me.Name, "Settings", "path", txtFileName.Text)
        End If
        
        
    End Sub
    
    Private Sub winSock_Close(Index As Integer)
    Dim iCounter As Long
        
        Debug.Print "winSocket Close (" & CStr(Index) & ")."
        
        For iCounter = 0 To lstClients.ListCount - 1
            If lstClients.List(iCounter) = winSock(Index).RemoteHostIP & " - " & winSock(Index).RemotePort Then
               lstClients.RemoveItem (iCounter)
               Exit For
            End If
        Next
        If lstClients.ListCount = 0 Then
            IsRunning = False
        End If
            
        'winSock(Index).Close
        Unload winSock(Index)
        winSocketCollection.Remove "ctl:" & CStr(Index)
    
    End Sub
    
    Private Sub winSock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim newIndex As Long
    
        newIndex = getNextAvailiableSocket
        Load winSock(newIndex)
        winSock(newIndex).LocalPort = 0
        winSock(newIndex).Accept requestID
        lstClients.AddItem winSock(newIndex).RemoteHostIP & " - " & winSock(newIndex).RemotePort
        cmdStart.Enabled = True
        
        If Not IsRunning And winSocketCollection.Count = 1 Then
            cmdStart_Click
        End If
        
    End Sub
    
    Private Sub winSock_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    Dim iCounter As Long
    
    On Error Resume Next
        
        CancelDisplay = True
        Debug.Print "winSocket Error (" & CStr(Index) & ") - (" & CStr(Number) & ") " & Description & "."
        
        For iCounter = 0 To lstClients.ListCount - 1
            If lstClients.List(iCounter) = winSock(Index).RemoteHostIP & " - " & winSock(Index).RemotePort Then
               lstClients.RemoveItem (iCounter)
               Exit For
            End If
        Next
        If lstClients.ListCount = 0 Then
            IsRunning = False
        End If
        
        'winSock(Index).Close
        Unload winSock(Index)
        winSocketCollection.Remove "ctl:" & CStr(Index)
    
    On Error GoTo 0
    End Sub
    
    Private Function getNextAvailiableSocket() As Long
    Dim currentControl As Long
    
        If winSocketCollection.Count = 0 Then
            currentControl = 1
            winSocketCollection.Add "ctl:" & CStr(currentControl), currentControl
            getNextAvailiableSocket = currentControl
        Else
            For currentControl = 1 To winSocketCollection.Count + 1
                If Not winSocketCollection.Exists("ctl:" & CStr(currentControl)) Then
                    winSocketCollection.Add "ctl:" & CStr(currentControl), currentControl
                    getNextAvailiableSocket = currentControl
                    Exit For
            
                End If
            Next
        End If
    
    
    End Function

    Το πιο έξυπνο "trick" που έχει το πρόγραμμα είναι πως αποθηκεύει τα καινούργια control στο winsock array που δημιουργεί για να δεχτεί τα νέα connections - βλ. function getNextAvailiableSocket().

     

    George J.

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  03-04-2010, 21:04 57935 σε απάντηση της 57932

    Απ: Socket Multithreading και Functions

    Καλησπερα φιλε μου

    Σου  ευχομαι Καλη Ανασταση 

    Χpησιμοποιω το  Async Multithreading Activex  και  απ οτι  βλεπω  υποστηριζει  Multithreading  .Δοκιμασα  αρκετα  παραδειγματα για  Multithreading ολα  σχεδον  κρασαρανε και το  πιο καλο απ ολα  ηταν αυτο  απο το thunderAsm.

    Τελικα κατεληξα στο  να  χρησιμοποιησω το παραπανω  activex  που αναφερω  .

    Το  παραδειγματακι σου  καλο και σε  ευχαριστω   αλλα στο  συγκεκριμενο στελνεις το  αρχειο σε  καθε πελατη.Τι  γινετε  στην περιπτωση που  στελνει αρκετα δεδομενα στον πελατη ?  Σημαινει  οτι περιμενουμε να τελειωσει ο πρωτος  για να στειλουμε στον επομενο

    Δεν εχω  προβλημα  στο να δεχομαι η να χειριζομαι συνδεσεις

    Το  ολο  σκεφτικο μου ειναι το να  μπορω  να  χειριζομαι  συνδεσεις  την ιδια  στιγμη  και να  στελνω  δεδομενα  ταυτοχρονα  σε περισοτερο απο ενα πελατη  ..

    καλο  βραδυ  φιλε   μου  

     

     


    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  04-04-2010, 02:09 57937 σε απάντηση της 57935

    Απ: Socket Multithreading και Functions

    Να υποθέσω ότι αναφέρεσαι σε αυτό το "Async"; Δεν το έχω χρησιμοποιήσει για να έχω μια άποψη τι μπορεί να κάνει, αλλά προσωπική θέση δεν θα χρησιμοποιούσα ένα προϊόν που η εταιρεία που το έχει αναπτύξει έχει πλέον κλείσει.

    Δεν είναι ανάγκη, να τελιώσει ο ένας client για να εξυπηρετήσεις τον επόμενο. Βασικά αν ο καθένας πρέπει να έχει την δική του απάντηση, μετά το accept του connection, θα πρέπει να εξασφαλήσεις ότι έχεις πάρει όλο το request, και μετά του δίνεις την απάντηση που περιμένει. Αν ο κώδικας δεν είναι "tight", σε κάποια σημεία θα διακόπτεται η ροή του προγράμματος και θα σηκώνει καινούργιο connection, θα διαβάζει βάση, και θα απαντάει, για διαφορετικό client κάθε φορά, οπότε θα έχεις multi-tasking, μέσα στα όρια ισχύος του επεξεργαστή που θα το τρέχει. Ξαναλέω, δεν πρέπει ο κώδικας να είναι "tight", και η ροή πρέπει να είναι event-driven. Αυτό που έχω κάνει εγώ είναι αρκετά εξειδικευμένο μιας και όλοι οι clients έπρεπε να παίρνουν τα ίδια δεδομένα.

    Με κώδικα παρόμοιο με τον παραπάνω, κατόρθωσα να εξυπηρετήσω 20-25 ταυτόχρονους clients, τρέχοντας σε ένα Windows NT v4.0 σύστημα. Η αλήθεια ήταν ότι 20-25 ήταν οι clients που ήταν στην ουρά για να εξυπηρετηθούν, ενώ πραγματικά εγώ είχα ένα, το πολύ δύο connections ανοιχτά - ο χρόνος που χρειαζόταν η VB6 να ανεβάσει ένα winsock control στην μνήμη και να ανοίξει TCP/IP επικοινωνία, ήταν πολύ μεγαλύτερος από τον χρόνο που χρειαζόμουν εγώ για να διαβάσω μια βάση μέσα από ODBC και να απαντήσω με 1Kb-1,5Kb δεδομένων.

    Δύο - τρία χρόνια αργότερα όταν χρειάστηκε να κάνω παρόμοια δουλειά με περισσότερους ταυτόχρονους χρήστες, δεν το πάλεψα καθόλου, αλλά χρησιμοποίησα για την μία και μόνη φορά στην ζωή μου το SOAP Toolkit της Microsoft. Όλο εκείνο το fine-tuning, που είχα κάνει για να ξεφορτώνονται όλα τα control και να μην έχω memory leaks, όλες εκείνες οι αμέτρητες ώρες που πέρασα επάνω από το working instance για να είμαι σίγουρος ότι δεν χάνει δεδομένα και δεν φορτώνει στο 100% επεξεργαστή, απλώς δεν χρειάζοντουσαν, αφού όλο το φορτίο της δουλειάς το πήρε ο IIS, που πραγματικά το αντέχει...

    Βέβαια, τότε είχα τις γκρίνιες που χρησιμοποιούσα τον IIS, και είχα φτιάξει ένα mini-web server σε VB6 για να μπορώ να τρέξω το server κομμάτι του SOAP, αλλά δεν το έβγαλα ποτέ στην παραγωγή. Ο IIS μπορεί να τρέξει επάνω και σε Windows XP ή όποιο άλλο client λειτουργικό, με τον περιορισμό των 10 ταυτόχρονων συνδέσεων, που αν θες να το περάσεις αυτό το όριο, ούτως ή άλλως, θα πρέπει να πας σε server λειτουργικό. Δεν το έχω αυτό το κομμάτι κώδικα πρόχειρο, αλλά και πάλι δεν νομίζω ότι αξίζει καν να ασχοληθείς αφού έχεις καλύτερη λύση και δωρεάν...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  05-04-2010, 21:53 57945 σε απάντηση της 57937

    Απ: Socket Multithreading και Functions

    Ευχαριστω φιλε  για  το ενδιαφερον   

    Το  συγκεκριμενο activex   το εχω και  απλα  το δοκιμαζω   .Ολα  αυτα πολυ  σωστα  τα  λες αλλα οπως  ειπα  στην περιπτωση που  υπαρχει μεταφορα  δεδομενων  συνεχεια  αναγκαστικα πρεπει  για  κα8ε  ενεργο Client να  υπαρχει ενα  thread  ετσι  ωστε  να  υπαρχει  ταυτοχρονη  μεταφορα  

    Θα δοκιμασω  και  θα  ποσταρω   νεωτερες πληροφοριες  

    καλο  βραδυ  


    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  05-04-2010, 22:25 57946 σε απάντηση της 57932

    Απ: Socket Multithreading και Functions

    Για να απαντησω συγκεκριμενα στην ερωτηση σου, ασχετα με το technology που χρησιμοποιεις. To Socket Multithreading συνηθως δουλευει με το εξης σκεφτικο:

    1. Το Main Thread (η το κυριως thread) "ακουει" στο port που θελεις. Το function που ακουει στο port mporei ειναι  non blocking ή blocking Wisock call kai εξαρταται απο εαν το προγραμμα σου κανει τιποτα αλλο, εκτος απο το να περιμενει συνδεση. Υπαρχουν τα σχετικα function calls για αυτο, μην γραψεις κανενα δικο σου "while true loop" για blocing calls γιατι θα στειλεις το CPU στα ουρανια. Τα winsock "listen" function calls, σιγουρεουν οτι το προγραμμα σου δεν σπαταλαει CPU ενω περιμενει τη συνδεση (ειναι event driven). Μπορεις δηλαδη να εχεις κυριως while loop, αλλα σιγουρεψου οτι το condition ειναι κατι σαν "w.listen == true" (η οποιο function to library soy dinei) , ή αμα το προγραμμα σου κανει και αλλα, τοτε εχεις γραψει ενα event driven function (w.onListen = foo()...)

    2. Οταν υπαρξει συνδεση, τοτε το control γυρναει στην επομενη γραμμη του "listen". Εκει αρχιζεις καινουργιο  thread και περνας σαν parameter την δυνδεση (connection object), η stream, η τι αλλο που εχεις. Σου προτεινω να μην εχεις κανενα κωδικο εκει (validation, ktl). Βασικα καινουργιο thread σημαινει οτι εχεις ενα static function (συνηθως) με parameters αυτα που θελεις και οπου σιγουρευεις οτι καθε exception γινεται handled εκει μεσα, ειδικα αμα το τρεχεις με σε web server η αλλα "apartment threaded environments". Οταν το thread call γινει fired τοτε συνεχιζει ο κωδικος στο 1. (ξαναρχιζει το while loop,  ή προχωρα ο κωδικος και κανει αλλα που θες) και ταυτοχρονα τρεχει και ο κωδικος στο 2.

    Τωρα εαν εχεις απορια πως μπορει ο κωδικος στο 1 να τρεχει και να ακουει αφου κανεις πραγματα με τη συνδεση στο 2, η απαντηση ειναι οτι internally το Winsock call που ακουει στο port poυ θελεις εχει κανει re-assign το port σε αλλο dynamic port "behind the scenes" οποτε ο κωδικος στο 2. δουλευει με connection στο δυναμικο port, οποτε το κυριως port στο 1 ειναι ελευθερο παλι...

    Ελπιζω να σου εδωσα μια ιδεα τοθ τι γινεται. Τωρα συγκεκριμενα με 3rd party Active X δεν ξερω εαν αυτο που χρησιμοποιεις ειναι γραμμενο καλα. Θα σου προτεινα να σιγουρευτιες οτι το ActiveX αυτο να ειναι "Free Threaded". To COM εχει settings για Single, Apartment  kai free Threaded οταν τρεχει τετοια libraries. Μπορεις να αλλαξεις εσυ τι settings, αλλα συνηθως αυτα τα settings μπορει να κανουν crash το library, εξαρταται πως ειναι γραμμενο...

     

  •  19-04-2010, 16:50 58156 σε απάντηση της 57946

    Απ: Socket Multithreading και Functions

    Συνημμένα: Screen01.JPG

    Καλησπερα  παιδια   

    Ειμαι  παλι εδω  με τις σκεψεις  μου  και τις  αποριες  μου   

    Πειραματιστηκα αρκετα  με το  async   και τελικα  καταφερα να  δημιουργησω ενα  project  στο  οποιο χρησιμοποιω Socket  api (vbip) .Καθε νεο  Socket   που  δημιουργειται   λειτουργει σε  νεο Thread   .Δηλαδη  οταν κανει listening(Thread  1 ),Connect (thread 2 ) κτλπ

    Αργοτερα που  θα βρισκομαι σπιτι θα  ποσταρω  μερικα  screenshots απο  το  παραδειγμα  .

    καλο απογευμα   


    Υ.γ   Εχει  πολυ  διαβασμα  ακομα  .οταν τελειωσει με το καλο θα ποσταρω  ενα  μικρο παραδειγματακι   






    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  19-04-2010, 23:39 58166 σε απάντηση της 58156

    Απ: Socket Multithreading και Functions

    Συνημμένα: Screen02.JPG

    ntaryl:

    Καλησπερα  παιδια   

    Ειμαι  παλι εδω  με τις σκεψεις  μου  και τις  αποριες  μου   

    Πειραματιστηκα αρκετα  με το  async   και τελικα  καταφερα να  δημιουργησω ενα  project  στο  οποιο χρησιμοποιω Socket  api (vbip) .Καθε νεο  Socket   που  δημιουργειται   λειτουργει σε  νεο Thread   .Δηλαδη  οταν κανει listening(Thread  1 ),Connect (thread 2 ) κτλπ

    Αργοτερα που  θα βρισκομαι σπιτι θα  ποσταρω  μερικα  screenshots απο  το  παραδειγμα  .

    καλο απογευμα   


    Υ.γ   Εχει  πολυ  διαβασμα  ακομα  .οταν τελειωσει με το καλο θα ποσταρω  ενα  μικρο παραδειγματακι   






    Rookie learn to fly U are my Inspiration...
    Who said Multithreading is impossible
    Try it First and after Deside if is Possible
  •  02-07-2010, 21:11 59343 σε απάντηση της 58166

    Απ: Socket Multithreading και Functions

    Δεν ξέρω πως πάει η προσπάθεια για multithreading και sockets σε VB6, αλλά μόλις έγραψα ένα blog post για τους διάφορους τρόπους με τους οποίους γίνεται το asynchronous network programming στο .NET και είπα να ρίξω κι εδώ τον πιο σύντομο τρόπο μέχρι στιγμής, χρησιμοποιώντας τα Reactive Extensions. Το παράδειγμα χρησιμοποιεί pipes αλλά στο post έχω και παράδειγμα με sockets. Σε κανένα σημείο δεν χρειάζεται να χειριστώ εγώ threads ή synchronization, ενώ ο κώδικας μοιάζει σχεδόν με απλό κώδικα :

        public class ReactivePipes:IAsyncBase
        {
            protected NamedPipeServerStream serverPipe = new NamedPipeServerStream("MyName"PipeDirection.InOut, 100, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
            protected NamedPipeClientStream clientPipe = new NamedPipeClientStream(".""MyName"PipeDirection.InOut, PipeOptions.Asynchronous);

            public void StartServer()
            {           
                
                var connect = Observable.FromAsyncPattern(serverPipe.BeginWaitForConnection, serverPipe.EndWaitForConnection);
                var read=Observable.FromAsyncPattern<byte[],int,int,int>(serverPipe.BeginRead,serverPipe.EndRead);
                var write=Observable.FromAsyncPattern<byte[],int,int>(serverPipe.BeginWrite,serverPipe.EndWrite);
                
                connect().Subscribe(u =>
                    {
                        byte[] msg = new byte[20];
                        read(msg, 0, msg.Length).Subscribe(i =>
                        {
                            var input =Encoding.UTF8.GetString(msg, 0,i);
                            string message =String.Format("You sent {0}",input);
                            byte[] buffer =Encoding.UTF8.GetBytes(message);
                            write(buffer, 0, buffer.Length);
                        });
                    });
            }


            public void StartClient()
            {
                var read = Observable.FromAsyncPattern<byte[], intintint>(clientPipe.BeginRead, serverPipe.EndRead);
                var write = Observable.FromAsyncPattern<byte[], intint>(clientPipe.BeginWrite, serverPipe.EndWrite);

                clientPipe.Connect();
                var output = Encoding.UTF8.GetBytes("5");
                write(output, 0, output.Length).Subscribe(u =>
                {
                    byte[] bytes = new byte[20];
                    read(bytes, 0, bytes.Length).Subscribe(i =>
                    {
                        string message = Encoding.UTF8.GetString(bytes, 0, i);
                        Console.WriteLine(message);
                    });
                });
            }
        }

     

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems