
peteruncle9 (Normal User)
Rookie
    
Messaggi: 26
Iscritto: 30/05/2009
|
Ho un'applicazione windows form VB.NET che gestisce un database SQL Compact. Avrei bisogno di riuscire ad accedere al database tramite un altro computer collegato in rete, riempendo un dataset, attraverso l'applicazione (poichè non uso SQL server).
In pratica l'applicazione client chiede i dati al server (attraverso TCP) che prende i dati dal database sql compact e li invia al client tenenedo traccia di quali dati sono inviati.
Ho due problemi:
1) Come inviare i dati al client (convertire la tabella di dati in Byte()?)
2) Come riempire il dataset con quei dati
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
|
|

peteruncle9 (Normal User)
Rookie
    
Messaggi: 26
Iscritto: 30/05/2009
|
Ok, ma ho un problema.
Nel client ho la sequente funzione: il client manda al server la stringa RQ_Table1 e il server rimanda DbDataset.Table1.WriteXml(networkStream)
Codice sorgente - presumibilmente VB.NET |
Function RQ_Table1() As System.IO.Stream Dim networkStream As NetworkStream = MyServer.GetStream Dim sendBytess As Byte() = Encoding.ASCII.GetBytes("RQ_Table1") networkStream.Write(sendBytess, 0, sendBytess.Length) Return networkStream End Function
|
Il server manda l'oggetto, ma il programma client va in blocco: nessun errore, ma non procede; se interrompo l'esecuzione e vado in debug resta fermo (evidenziato in verde) sull'istruzione:
Codice sorgente - presumibilmente Plain Text |
DbDataSet.Table1.ReadXml(RQ_Table1)
|
Ultima modifica effettuata da peteruncle9 il 05/12/2009 alle 15:18 |
|

peteruncle9 (Normal User)
Rookie
    
Messaggi: 26
Iscritto: 30/05/2009
|
Ho capito il mio problema: l'oggetto da mandare occupa 2 o 3 MB. Provando a salvare lo Stream in un file ho visto che si ferma a 9 Kb. C'è un problema con il buffer, receiveBufferSize e SendbufferSize che interrompono il messaggio? Come risolvere il problema?
Nel server ho
Codice sorgente - presumibilmente C# / VB.NET |
If clientdata = "RQ_Table1" Then
Table1TableAdapter.Fill(DbDataset.Table1)
myClient.SendBufferSize = 0 'e qui??? quanto mettere?
DbDataset.Table1.WriteXml(networkStream)
End if
|
A quanto aumentare la dimensione del buffer? Se la aumento troppo mi crea un file vuoto alla fine. Come sapere la dimensione esatta?
Ultima modifica effettuata da peteruncle9 il 06/12/2009 alle 11:58 |
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
Invece di aumentare la dimensione del buffer, mantieni uno stream temporaneo ed esegui delle verifiche cicliche sui nuovi dati in arrivato: man mano accodi i nuovi dati sullo stream temporaneo e alla fine leggi il tutto.
Per essere sicuro di ottenere le informazioni giuste, sarebbe opportuno usare una porta riservata a questo. Per eseguire i controlli puoi usare un timer o un ciclo. In entrambi i casi, sarebbe opportuno introdurre un qualche sistema di controllo per verificare la fine e l'attendibilità dei dati, come ad esempio un checksum.
Se non vuoi fare questo, basta inviare la dimensione del buffer, leggerla dallo stream e impostarla sulla nuova ricevuta, ma te lo sconsiglio.
|
|

peteruncle9 (Normal User)
Rookie
    
Messaggi: 26
Iscritto: 30/05/2009
|
Potresti fare qualche esempio pratico?
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
Esempio grezzo:
Codice sorgente - presumibilmente VB.NET |
Private XmlStream As IO.MemoryStream '... If clientdata = "RQ_Table1" Then Table1TableAdapter.Fill(DbDataset.Table1) XmlStream = New IO.MemoryStream() DbDataset.Table1.WriteXml(XmlStream) XmlStream.Position = 0 Dim T As New Threading.Thread(AddressOf SendXml) T.Start() End If '... Private Sub SendXml() Dim Buffer(myClient.SendBufferSize - 1) As Byte Do XmlStream.Read(Buffer, 0, Buffer.Length) networkStream.Write(Buffer, 0, Buffer.Length) 'Threading.Thread.Sleep(10) < potrebbe essere utile Loop Until XmlStream.Position >= XmlStream.Length End Sub
|
|
|

peteruncle9 (Normal User)
Rookie
    
Messaggi: 26
Iscritto: 30/05/2009
|
Perfetto, ma così non c'è comunque alcuna verifica che il flusso sia arrivato correttamente.
Sul client, invece, devo creare un memorystream che continua a leggere finchè non finisce di trasmettere, ma come dirgli che è finita la trasmissione?
Sul client:
Codice sorgente - presumibilmente VB.NET |
Overloads Function RQ_table1() As System.IO.Stream Dim networkStream As NetworkStream = MyServer.GetStream Dim sendBytess As Byte() = Encoding.ASCII.GetBytes("RQ_Table1") Dim bytes(MyServer.ReceiveBufferSize) As Byte networkStream.Write(sendBytess, 0, sendBytess.Length) Do networkStream.Read(bytes, 0, CInt(MyServer.ReceiveBufferSize)) Loop 'fino a quando continuare? Return networkStream End Function
|
Ultima modifica effettuata da peteruncle9 il 07/12/2009 alle 16:29 |
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
Quando la funzione Read restituisce un numero inferiore alla dimensione del buffer, significa che sono stati letti meno dati di quelli che ci si aspettava. Ergo, non c'è più niente altro da leggere: la trasmissione è finita.
Dovrebbe funzionare...
Codice sorgente - presumibilmente C# / VB.NET |
Do
ReadBytes = networkStream.Read(...)
Loop Until ReadBytes < MyServer.ReceiveBufferSize
|
|
|