|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[java] invio di file tramite socket, salva i dati sul disco?
Salve, ho una curiosità su Java e la programmazione client-server. Ho un client e un server; dal client invio 2 file di testo, tramite le socket (quindi leggo il file tramite un programma che gira sul client, e invio i singoli byte del file) al server;
quest'ultimo salverà la sequenza di byte in 2 variabili stringa, e in seguito potrò accedere al "contenuto" del file usando soltanto quelle variabili. Facio un esempio sempice...se voglio creare un file di testo contenente il contenuto delle 2 variabili. In questo pocesso di copia, i dati trasferiti dal client al server non verranno mai salvato sul disco, ma al massimo nella stessa area di memoria ram che il sistema stà riservando a java in quel momento. E' corretto come ragionamento???
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
|
...se travasi i byte nella stringa di volta in volta nulla viene scritto...consiglio l'uso di un buffer piu' efficente al posto della String...sopratutto se non conosci la dimensione del file di test da inviare/ricevere...
...ciao Andrea... |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
non ho capito niente, specialmente non ho capito cosa c'entrano i socket e perché i file di testo sono due, ma tieni presente che il sistema potrebbe decidere di mettere in swap il contenuto delle stringhe.
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
di norma (poi dipende dal SO) i dati vengono prima piazzati nel buffer del DMA della scheda di rete (se non utilizzi adattatori usb) e poi ricopiati nella variabile stringa del processo jvm. Parliamo di dati volatili, ma nulla impedisce al SO di paginare sul disco quelle locazioni, soprattutto se il sistema ha poca ram.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Ok mi spiego meglio
Devo creare un'applicazione client server. Il client deve inviare 2 file A e B al server. Questi 2 file sono stati creati a partire da un certificato utente x509 .p12. Non vorrei inviare il file p12 al server, per evitare che qualcun altro possa copiarlo, e per fare in modo che quest'ultimo rimanga sempre in possesso del client, sulla sua macchina Per questo motivo io creo questi file A e B (creati tramite la funzione opensso di java mi pare) invio questi 2 file al client che creerà un terzo file a partire da questi 2. Per inviare i dati dal client al server devo utilizzare le socket..o c'è qualche altro metodo?? Adesso, il client invia i byte del primo file al server, che li memorizza in un buffer (come mi è stato fatto notare, soluzione migliore Adesso, l'ultima operazione è creare il 3° file dai 2 che ho prelevato dal buffer. La cosa principale è evitare che i 2 file prelevati dal client vengano salvati sulla memoria del server...ma al massimo restano nella ram e nelle variabili di java.. ho cercato di essere più chiaro possibile..altrimenti riscrivo
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Come ragionamento no, in pratica nì.
Ci sono due motivi per cui il ragionamento non fila. Quello certo è che la memoria assegnata ad un processo potrebbe risiedere sul disco fisso. Il famigerato "swap" ne è un sintomo. Quella ipotetica è una questione di contratti. Il socket delle librerie standard di Java è l'astrazione di una connessione di rete e il contratto di quell'astrazione dice grossomodo: mi connetto e ti consento di trasferire dati attraverso dei flussi. Quel che capita ai dati tra durante l'invio non è specificato. Sarebbe perfettamente ammissibile ancorchè bizzarra un'implementazione di Socket il cui flusso usasse un pezzo del disco come tampone. Il ragionamento è in parte valido per una specifica versione di Java. Data la disponibilità dei sorgenti uno può lecitamente affermare che nell'implementazione di Java OpenJDK 6 b19 la ricezione di dati attraverso dei Socket non comporti la scrittura di quei dati sul disco fisso da parte della piattaforma Java. Resta sempre il problema dello swap.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4423
|
...ok...ma qui il problema non è piu' Java...ma tutta la struttura interessata nel trasferimento...
...ciao Andrea... |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Be' alla fine sì. Il discorso che vale per java.net.Socket vale anche per le sue controparti native.
Il fatto è che la preoccupazione che qualcosa non venga "fissato" sul disco fisso sa tanto di un problema di sicurezza e di sicurezza, come si dice, non se ne può fare "un po'", o si fa tutta o non si fa.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Si un po è un problema di sicurezza....Ora vi spiego tutto il problema.
l'utente per poter fare delle operazioni sul server, deve avere un certificato X509. Partendo da questo certificato, una volta inserita una password sua personale, si vengono a creare 2 file userkey.pem e usercert.pem Una volta ottenuti questi 2 file, tramite un comando (che è possibile dare soltando dalla machina server) creo un file chiamato proxy..e grazie a questo proxy si riesce ad usare il sistema. Adesso, io vorrei fare in modo che l'utente sulla sua machina avvii un programma che gli chiede di inserire la password e il percorso del certificato; in questo modo sulla sua machina sempre mi creo i file userkey.pem e usercert.pem, prendo questi file e tramite le socket li invio al server, che mi crea il proxy e poi "svuota" il contenuto delle variabili/buffer. Per problemi di sicurezza appunto vorrei evitare di salvare il certificato sul server, cosi come le chiavi pem..ed è per questo che penso sia più sicuro che queste chiavi risiedano per pochi secondi in memoria ram (come contenuto di un buffer) piuttosto che come file nel server (a cui accedono molti utenti). Correggetemi se il ragionamento è errato....prendere questo certificato p12 e salvarlo sul server, e da questo creare i file pem e infine il proxy, per poi eliminare il p12 e i pem, mi sembra un'operazione più "rischiosa"...
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
up
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:01.



















