• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida Socket-SendFile

TBH

Utente Master
Autore del topic
24 Dicembre 2012
2.134
115
Miglior risposta
0
Questa guida non tratterà come le precedenti l'awt ma bensì i socket non mi soffermerò a spiegare nel dettaglio java.net bensì mostro un semplice esempio di comunicazione TCP/IP in java usando il package java.net. Il programma composto da un lato client e lato server [/B] eseguirà le seguenti operazioni.

Il client
-Tentativo di Connessione su un ip e porta
-Comunicazione dell'estensione e lunghezza dal file da parte del client
-Invio del file

Il Server
-Avviare la connessione
-accettare il client
-Decifrare le informazioni utili
-Ricevere e creare il file in base alle informazioni ottenute


Come potete notare sono operazioni piuttosto comuni, vediamo di analizzare in dettagli ogni operazione partendo dal server.

Il server

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Partiamo dal Package che conterrà tutte le classi create. Come per esempio Server.Identifichiamo il punto d'ingresso che è il main , di tipo static appunto perchè la JVM non può istanziare tale classe e notiamo che eseguo la propagazione dell'eccezione fino alla JVM(Quindi in finale è un eccezione che ho deciso di non gestire).

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Iniziamo ad analizzare questa classe , partendo dal costruttore , come potete notare ,non uso il costruttore predefinito. Infatti il costruttore della Classe Server accetta un int , che rappresenta il numero di porta.

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
Il primo buffer , che deriva dalla classe Reader mi serve per gestire il testo che ricevo , invece il secondo buffer per gestire i byte del file.
da notare che la comunicazione Tcp/ip è bidirezionale, nel mio caso prendo soltanto l'inputStream, dato che il server è adempito per ricevere soltanto.

Passiamo alla seconda parte ...

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Per snellire il codice ho usato una classe anonima senza nome, in pratica definisco la classe stessa ereditando TimerTask dato che schedule accetta un TimerTask, che a sua volta implementa l'interfaccia Runnable , in questo modo posso gestire la ricezione del testo , in un thread separato.Da prestare attenzione che dopo la classe anonima c'è anche ,2, è il secondo argomento di schedule che indica quante volte dovrà ripetere l'azione in run(Metodo definito dall'interfaccia). Run chiama il metodo controllainfo , dopodiché controlla se nella stringa data è presente del testo , se c'è interrompe il timer chiamando cancel e crea un altro Thread per la ricezione del file.


Ora passiamo alla vera è propria lettura dei dati che sono: l'estensione - la lunghezza del file

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

ora vediamo un altra classe interna , creata per il semplice fatto di poter accedere rapidamente ai membri della classe Server. Detto ciò vediamo cosa fa.

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

I commenti spiegano le parti essenziali del listato aggiungo solo una cosa per quanto riguarda i Thread. Infatti quest'ultimi possono essere "creati" anche nei seguenti modi:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
Ora passiamo al client.


Il Client

Il client , è la quella applicazione che tenta di Connettersi al server ,conoscendo ip e porta.
N.b per Utilizzare l'applicazioni in remoto bisogna sbloccare le porte TCP

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Classe Dati

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Classe SendFileClient

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


Iniziamo dalla classe principale , dove c'è il main:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Passiamo alla seconda classe , che l'ho organizzata in modo tale , che controllasse se un file è valido , otteneva il suo nome e la lunghezza. In pratica si occupava della gestione locale.

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Infine analizziamo la classe Client


Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


Con questo è tutto se vi interessa il progetto già pronto contattatemi.:bye:

N.b la velocità d'invio in remoto dipende dalla rete.
 
Spiegami una cosa. Cos'è che rende la comunicazione tra un server e un client indisturbata? Cioè, se il client vuole connettersi al Server1 e non al Server2, cos'ha di univoco quel server che viene riconosciuto?
 
@HabboFanNumero1 un qualsiasi socket può provare connessione su qualsiasi porta. Una volta connesso invia dei dati che solo quel server capisce. Ad esempio spesso vengono criptati , oppure è lo stesso server a reputare compatibile o meno quel client(ad esempio può essere una password).Volendo si può tranquillamente implementare questo controllo da parte del server.
In questo caso uso la porta 411 dove non c'è nessun server attivo, quindi non sorge il problema.
 
@HabboFanNumero1 un qualsiasi socket può provare connessione su qualsiasi porta. Una volta connesso invia dei dati che solo quel server capisce. Ad esempio spesso vengono criptati , oppure è lo stesso server a reputare compatibile o meno quel client(ad esempio può essere una password).Volendo si può tranquillamente implementare questo controllo da parte del server.
In questo caso uso la porta 411 dove non c'è nessun server attivo, quindi non sorge il problema.
Ah ecco, quindi è la porta a identificare "la residenza" del server, altrimenti il client su tante "case" non saprebbe dove andare a sbattere. Grazie mille!

Tornando alla guida, siccome non posso farti domande sul codice perché non conosco il Java, ti faccio una piccola domanda teorica:

N.b per Utilizzare l'applicazioni in remoto bisogna sbloccare le porte TCP
Che intendi dire? E' lo stesso discorso per chi crea retroserver?
 
Esattamente, il Server lavora su uno specifico IP e una specifica porta, non si può sbagliare.

Ottima guida come sempre TBH, ti ringrazio molto per questo tuo contributo che stai dando con le tue guide ampie e dettagliate, continua così.

Ps: e sistema il piccolo errore di BBcode all'inizio. :emoji_relieved:
 
Niente proprio non mi va giù questo codice Java...rimango sempre dell'idea che scriverei un server in C++ e il client in qualsiasi altro linguaggio, che non sia il Java.
 
Niente proprio non mi va giù questo codice Java...rimango sempre dell'idea che scriverei un server in C++ e il client in qualsiasi altro linguaggio, che non sia il Java.

Io il Java lo odio, ma ne traggo la teoria per applicare la pratica con altri linguaggi.

Comunque, in riferimento alla tua affermazione, perché dici di preferire un server in C++ e un client in un altro linguaggio? Non puoi farli entrambi in C++ o entrambi in C o entrambi in Java?
 
Io il Java lo odio, ma ne traggo la teoria per applicare la pratica con altri linguaggi.

Comunque, in riferimento alla tua affermazione, perché dici di preferire un server in C++ e un client in un altro linguaggio? Non puoi farli entrambi in C++ o entrambi in C o entrambi in Java?

Si vede che ha esigenze diverse, con un altro linguaggio magari puoi fare cose che non puoi fare in C.
Java lo odi perché lo hai provato o perché lo hai sentito dire? :emoji_relieved:
 
Si vede che ha esigenze diverse, con un altro linguaggio magari puoi fare cose che non puoi fare in C.
Java lo odi perché lo hai provato o perché lo hai sentito dire? :emoji_relieved:

Dvd ho passato l'inferno a creare app android in Java. Ci ho provato almeno novantamila volte scaricando, disinstallando e riscaricando Eclipse ma nulla... non mi scende giù.
Conosco le basi giusto per conoscerle, ho provato a creare anche delle Applet da niente. Niente. Non mi attira proprio.
 
@System32
la teoria da applicare per comunicare rimane pressochè simile. Certo la gestione dei thread è diversa ma il ragionamento sul trasferimento è uguale.
@HabboFanNumero1

Ma prima di scrivere un app per android devi conoscere bene il java.
Le applet sono la parte più inutile di java servono per introdurre all'awt (ma poi basta). Onestamente di applet in giro ne ho viste ben poche.
 
@System32
la teoria da applicare per comunicare rimane pressochè simile. Certo la gestione dei thread è diversa ma il ragionamento sul trasferimento è uguale.
@HabboFanNumero1

Ma prima di scrivere un app per android devi conoscere bene il java.
Le applet sono la parte più inutile di java servono per introdurre all'awt (ma poi basta). Onestamente di applet in giro ne ho viste ben poche.

Anche perché le applet al massimo si usavano sul web per fare cose interattive, ma ora ci sono ben altri mezzi. :emoji_relieved:
 
  • Like
Reactions: 1 person
@TBH di solito non ho mai pregiudizi... ma il Java NO! :emoji_relieved:
Fai una guida identica però usando il C e poi ne parliamo xD
@Dvdxseo ormai c'è Flash che accontenta tutti :soso:
 
@HabboFanNumero1 molte applicazione che usi , usano java.
Forse lo scriverò più in là in C++. Comunque dalla nascita ad ora Java è migliorato moltissimo anche a livello di consumi , perché parlando chiaramente quello rimane il problema principale , ma io lo reputo il minimo prezzo da pagare per la portabilità. Poi esistono svantaggi da ambedue i lati
 
molte applicazione che usi , usano java.
Si lo so, ma io preferisco le applicazioni desktop D:

Forse lo scriverò più in là in C++.
Non aspetto altro, davvero :emoji_smiley:

Comunque dalla nascita ad ora Java è migliorato moltissimo anche a livello di consumi , perché parlando chiaramente quello rimane il problema principale , ma io lo reputo il minimo prezzo da pagare per la portabilità. Poi esistono svantaggi da ambedue i lati

Io, sinceramente, non capisco a cosa potrebbe servire. A parte che Android è programmato interamente in Java, ma poi? A cosa mi potrebbe servire? Le stampanti sono programmate in Java?
 
@HabboFanNumero1
mi riferisco esclusivamente ad applicazioni desktop.

Molti programmi sono scritti in java , anche programmi embedded. Palmari, i vecchi cellulari che si basavano su symbian ,applicazioni per android , applicazione per desktop su windows e Mac etc.. Come detto prima , ci sono vantaggi e svantaggi da ambedue le parti .
Android è basato sul kernel linux e sicuramente non è scritto in java :soso:
 
@HabboFanNumero1
mi riferisco esclusivamente ad applicazioni desktop.

Molti programmi sono scritti in java , anche programmi embedded. Palmari, i vecchi cellulari che si basavano su symbian ,applicazioni per android , applicazione per desktop su windows e Mac etc.. Come detto prima , ci sono vantaggi e svantaggi da ambedue le parti .
Android è basato sul kernel linux e sicuramente non è scritto in java :soso:

Perché le cose che odio sono sempre essenziali? -.-
 
Perché le cose che odio sono sempre essenziali? -.-

ma non capisco da dove nasce tutto questo odio verso il java ? dato che ha un sintassi ispirata al C/C++. ha il Garbage Collection che ti semplifica la vita e un numero "infinito" di package che non ti obbligano a legarti all'Os(Eccetto rari casi) :emoji_confused:
 
ma non capisco da dove nasce tutto questo odio verso il java ? dato che ha un sintassi ispirata al C/C++. ha il Garbage Collection che ti semplifica la vita e un numero "infinito" di package che non ti obbligano a legarti all'Os(Eccetto rari casi) :emoji_confused:

Che tu mi nomini il Garbage Collection io non so cos'è e non ti capisco, il mio odio rimane sempre quello. :emoji_relieved:
Non mi piace perché non... non mi ispira! Non mi ha mai attirato attenzione. L'unica cosa che mi interessa è prepararmi al futuro. Posso sembrarti davvero una persona ignorante e banale ma ti riformulo l'esempio: per sviluppare grandi software che tutti noi conosciamo (Skype, quelli della Adobe e molti altri) è stato utilizzato Java? Mhm... non credo.

EDIT:

Tutto quello che mi interessa è la professionalità. Io miro alla professione. Io ho sempre programmato C/C++ sulla console ma poi ho capito che NON esistono software famosi in console ma solo in Windows Form. Capisci?
Il Java non so a cosa potrebbe servirmi in futuro... :emoji_confused:
 
Ultima modifica:
Il Garbage Collector è quello che ripulisce la memoria quando ce n'è bisogno, in parole povere.
Ma comunque a me Java non piace molto per una questione di sintassi soprattutto.
Java è comunque un linguaggio importante e ampiamente usato. Jdownloader per esempio (almeno su Mac) è scritto in Java. Tante cose usano Java senza che tu te ne accorga, non c'è motivo per disprezzarlo, e viene usato da tutti praticamente per iniziare con la OOP.
Per quanto riguarda Android il Kernel è ovviamente Linux, mentre le app ad alto livello sono sviluppate in Java. Quelli che vogliono lavorare più a basso livello usano il C.

Comunque non discostiamoci troppo dall'argomento principale del thread, che erano i socket. :emoji_slight_smile: