Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
10/06/08 14:58
klez91
Rieccomi dinuovo qua con un'altra domanda sui sockets, ormai qst è un'argomento che mi appassiona :). Questo volta vi chiedo se fosse possibile creare un server che gestisca le connessioni in entrata, accettando una richiesta allo volta( scelta dall'utente)e mettendo in attesa le altre x poi accettarle in un secondo momento. Io avevo pensato a una ListBox che per ogni richiesta di connessione aggiungesse alla lista l'IP del client, e l'utente sceglie dalla lista quale IP accettare... Secondo voi è fattibile( in Vb.Net ovviamente)????? Grazie mille!!!
Ultima modifica effettuata da klez91 11/06/08 10:36
aaa
11/06/08 18:57
Il Totem
Sì è possibile, ma per sapere l'IP di una connesione in entrata devi prima accettare la stessa connessione. Inoltre il server non può accettare più di un numero massimo di connessione che decidi tu.
aaa
12/06/08 11:04
klez91
Grazie Totem per la risposta. Volevo chiederti 2 cose. Come faccio a stabilire il numero massimo di connessioni ??? Poi secondo te come potrei fare im modo che per ogni client in attesa venga aggiunto ad una ListBox un item del tipo "C'è un nuovo client in attesa numero n( dove n sia un numero o una lettera che comunque lo distingua dagli altri client)" e l'utente a secondo del client selezionato decide di accettare tale connessione ???? Grazie ancora!
aaa
12/06/08 13:53
Il Totem
Postato originariamente da klez91:

Grazie Totem per la risposta. Volevo chiederti 2 cose. Come faccio a stabilire il numero massimo di connessioni ??? Poi secondo te come potrei fare im modo che per ogni client in attesa venga aggiunto ad una ListBox un item del tipo "C'è un nuovo client in attesa numero n( dove n sia un numero o una lettera che comunque lo distingua dagli altri client)" e l'utente a secondo del client selezionato decide di accettare tale connessione ???? Grazie ancora!


Per stabilire il numero massimo di connessione devi usare un particolare overload di Start (metodo della classe TcpListener o Socket), che accetta un solo parametro intero specificante il massimo di connessioni simultanee possibili.
Listener.Start(3)


Come detto prima, per sapere l'IP devi accettare la connessione in entrata, e dato che i client in attesa non si possono memorizzare se non accettandoli, devi per forza prima di ogni altra cosa accettare la connessione. Dopodiché puoi inviare al client una stringa che definisci tu, ad esempio "WAIT" che indica di aspettare, quindi memorizzi il TcpClient associato in una lista qualsiasi e aggiungi alla listbox il suo ip. Fatto ciò, quando l'utente sul server sceglie un ip dalla listbox recuperi il tcpclient associato e mandi un messaggio di conferma o di negazione. In caso di negazione, il client si disconnette

Il procedimento è un po' macchinoso, ma credo che funzioni.
aaa
12/06/08 17:36
klez91
Il ragionamento non fa una piega grazie, però prima di metterlo in atto ho provato a fare delle prove appunto per la gestione di due connessione su un server utilizanndo il seguente codice ke però mi da alcuni problemi. Infatti il client non è in grado di comunicare con il server finchè tutte le connessioni stabilite nell'overload di star non sono state effettuate. Non riesco a capire il perché. Potresti aiutarmi ancora una volta, grazie ?
Ecco il sorgente :
Imports System.Net
Imports System.Net.Sockets

Public Class Form1
    Public Client1, Client2 As New TcpClient
    Public Ascolta As New TcpListener(256)
    Public NetStream1, NetStream2 As NetworkStream
   
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Ascolta.Start(2)
        tmrPending.Start()
    End Sub

    Private Sub tmrPending_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrPending.Tick
        If Ascolta.Pending Then
            Client1 = Ascolta.AcceptTcpClient
            NetStream1 = Client1.GetStream
            tmrDati.Start()
            Client2 = Ascolta.AcceptTcpClient
            NetStream2 = Client2.GetStream
        End If

    End Sub

    Private Sub tmrDat1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrDati.Tick
        If Client1.Available > 0 And NetStream1.CanRead Then
            Dim Bytes(Client1.ReceiveBufferSize) As Byte
            NetStream1.Read(Bytes, 0, Client1.ReceiveBufferSize)
            MsgBox("Client1 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes))
        End If
        If Client2.Available > 0 And NetStream2.CanRead Then
            Dim Bytes2(Client2.ReceiveBufferSize) As Byte
            NetStream2.Read(Bytes2, 0, Client2.ReceiveBufferSize)
            MsgBox("Client2 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes2))
        End If
    End Sub
End Class
aaa
13/06/08 14:23
Il Totem
Postato originariamente da klez91:

Il ragionamento non fa una piega grazie, però prima di metterlo in atto ho provato a fare delle prove appunto per la gestione di due connessione su un server utilizanndo il seguente codice ke però mi da alcuni problemi. Infatti il client non è in grado di comunicare con il server finchè tutte le connessioni stabilite nell'overload di star non sono state effettuate. Non riesco a capire il perché. Potresti aiutarmi ancora una volta, grazie ?
Ecco il sorgente :
Imports System.Net
Imports System.Net.Sockets

Public Class Form1
    Public Client1, Client2 As New TcpClient
    Public Ascolta As New TcpListener(256)
    Public NetStream1, NetStream2 As NetworkStream
   
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Ascolta.Start(2)
        tmrPending.Start()
    End Sub

    Private Sub tmrPending_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrPending.Tick
        If Ascolta.Pending Then
            Client1 = Ascolta.AcceptTcpClient
            NetStream1 = Client1.GetStream
            tmrDati.Start()
            Client2 = Ascolta.AcceptTcpClient
            NetStream2 = Client2.GetStream
        End If

    End Sub

    Private Sub tmrDat1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrDati.Tick
        If Client1.Available > 0 And NetStream1.CanRead Then
            Dim Bytes(Client1.ReceiveBufferSize) As Byte
            NetStream1.Read(Bytes, 0, Client1.ReceiveBufferSize)
            MsgBox("Client1 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes))
        End If
        If Client2.Available > 0 And NetStream2.CanRead Then
            Dim Bytes2(Client2.ReceiveBufferSize) As Byte
            NetStream2.Read(Bytes2, 0, Client2.ReceiveBufferSize)
            MsgBox("Client2 ha inviato: " & System.Text.ASCIIEncoding.ASCII.GetString(Bytes2))
        End If
    End Sub
End Class


Come alternativa puoi reinizializzare un nuovo listener ad ogni connessione accettata.

Quando Peding restituisce True, significa che c'è una connessione in attesa, ma tu le accetti entrambe, ossia client2 e client1 rappresentano la stessa connessione. Una volta ricevute e accettate le richieste, dovresti mandare la stringa Wait di prima, cosa che qui non hai fatto. Forse è meglio che semplifichi le cose usando un array o una lista.
aaa
14/06/08 13:05
klez91
Grazie Totem per il momento ho risolto! Prima di postare il sorgente sopra avevo provato a impostare i vari TCPClient utilizzando vari "if ...Pending" ma erano sorti altri problemi di conessione. Per il fatto della stringa "WAIT" nel sorgente non l'ho messo perché stavo cercando di capire prima un po il funzionamento della connessione multipla, e poi successivamente avrei implementato tutto nel mio progetto. Per il resto ho risolto con un array di TCPClient e NetworkStream associato. Thanks :k: !!!
aaa
15/06/08 11:34
Il Totem
Ok, allora posso chiudere.
aaa