klez91 (Normal User)
Pro
Messaggi: 117
Iscritto: 04/05/2008
|
Questo topic è stato chiuso dal moderatore 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 il 11/06/2008 alle 12:36 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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.
|
|
klez91 (Normal User)
Pro
Messaggi: 117
Iscritto: 04/05/2008
|
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!
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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.
Codice sorgente - presumibilmente Plain Text |
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. |
|
klez91 (Normal User)
Pro
Messaggi: 117
Iscritto: 04/05/2008
|
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 :
Codice sorgente - presumibilmente VB.NET |
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
|
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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 :
Codice sorgente - presumibilmente VB.NET |
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. |
|
klez91 (Normal User)
Pro
Messaggi: 117
Iscritto: 04/05/2008
|
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 !!!
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Ok, allora posso chiudere.
|
|