PDA

View Full Version : java...guida ai socket


SteR9
29-06-2003, 17:46
mi potreste consigliare una buona guida sui socket in java??
possibilmente in italiano e soprattutto con esempi...
vorrei riuscire a creare un client irc :eek:
grazie

PGI
29-06-2003, 22:39
in italiano non saprei darti un link di riferimento, ma in inglese c'è questo (http://www.javaworld.com/javaworld/jw-12-1996/jw-12-sockets.html)
con un bell'esempio completo a pagina 2.

Tieni conto che in java socket e thread sono talmente semplici da gestire che non credo ci siano guide più complete di quella che ti segnalo.

Ciao.

SteR9
29-06-2003, 23:39
il link corretto è questo (http://www.javaworld.com/javaworld/jw-12-1996/jw-12-sockets.html)
grazie!

PGI
29-06-2003, 23:46
Grazie di che, ti mando pure i link sbagliati! :muro:

Ho corretto l'URL che avevo postato spostandolo sul quello che hai segnalato tu ( è ora che io prenoti un posto all'ospizio se c'è bisogno che qualcuno mi segnali quali sono i link che volevo segnalare io :D )

Scusa ancora.

Ciao

SteR9
01-07-2003, 07:03
se io volessi loggarmi in un server ftp non mi basta fare
os.writeBytes("user guest\n");
os.writeBytes("pass guest\n");
?
poi non riesco a capire a cosa serve

catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: hostname");
}

grazie!

Nemok
01-07-2003, 10:40
Si tratta di gestione delle eccezioni.Ogni azione che può sollevare un'eccezione va incorporata in un blocco try/catch.Nel blocco catch metti come ci si deve comportare in caso di una eccezione (in questo caso IOException),nel tuo caso stampi una stringa e l'errore.

PGI
01-07-2003, 12:03
Originally posted by "SteR9"

se io volessi loggarmi in un server ftp non mi basta fare
os.writeBytes("user guest\n");
os.writeBytes("pass guest\n");


Per un Client FTP puoi gardare le due pagine di questo bell'articolo (in italiano):

pagina 1 (http://www.mokabyte.it/1998/04/ftp1.htm)

pagina 2 (http://www.mokabyte.it/1998/06/ftp2.htm)

SteR9
01-07-2003, 20:14
Originally posted by "PGI"



Per un Client FTP puoi gardare le due pagine di questo bell'articolo (in italiano):

pagina 1 (http://www.mokabyte.it/1998/04/ftp1.htm)

pagina 2 (http://www.mokabyte.it/1998/06/ftp2.htm)
ho provato con
os.println("user guest");
ma mi da questo errore
cannot resolve symbol
symbol : method println (java.lang.String)
location: class java.io.DataOutputStream
os.println("user guest");
^

perchè??

PGI
02-07-2003, 14:21
Secondo il messaggio di errore del compilatore, nel codice si cerca di usare il metodo println (appartenente agli oggetti PrintStream) con un oggetto DataOutputStream (che non ha il metodo println()).

Se stai usando un socket, per usare un printstream devi prendere il canale di output e passarlo al costruttore PrintStream(OutputStream out):

PrintStream printer=new PrintStream(socket.getOuputStream());

Se vuoi lavorare con un DataOutputStream su stringhe (con la certezza che ciò che parte sia anche ciò che arriva) devi codificare i byte che rappresentano la stringa.
Il package java.nio.charset contiene i relativi strumenti.

Ciao.

SteR9
03-07-2003, 16:49
ok sono riuscito a fare tutto...
ora vorrei se io volessi usare dei proxy???esiste un metodo che mi permette di utilizzarli??

PGI
03-07-2003, 17:12
Vuoi fare un proxy usando java o vuoi far passare la connessione che hai creato in java attraverso un server proxy?

SteR9
03-07-2003, 17:29
Originally posted by "PGI"

Vuoi fare un proxy usando java o vuoi far passare la connessione che hai creato in java attraverso un server proxy?
voglio far passare la connessione che ho creato in java attraverso un server proxy... :)

PGI
03-07-2003, 17:45
Non garantisco nulla, ma il codice per "bucare" il server proxy (FTP) dovrebbe essere


Properties p=System.getProperties();
p.put( "ftpProxySet", "true" );
p.put( "ftpProxyHost", "host proxy" );
p.put( "ftpProxyPort", "porta proxy" );
p.put( "ftpProxyUserName", "proxyUserName");
p.put( "ftpProxyPassword", "proxyPassword");


funziona?

SteR9
03-07-2003, 18:01
Originally posted by "PGI"

Non garantisco nulla, ma il codice per "bucare" il server proxy (FTP) dovrebbe essere


Properties p=System.getProperties();
p.put( "ftpProxySet", "true" );
p.put( "ftpProxyHost", "host proxy" );
p.put( "ftpProxyPort", "porta proxy" );
p.put( "ftpProxyUserName", "proxyUserName");
p.put( "ftpProxyPassword", "proxyPassword");


funziona?
ma come lo devo utilizzare ??
in pratica sto creando un client irc e vorrei dare la possibilità di collegarsi al server anche tramite proxy...posso utilizzare il codice che mi hai dato??se si come?

PGI
03-07-2003, 18:56
Quelle cinque righe cambiano alcune proprietà lette dalla jvm a runtime in modo tale che di fronte all'apertura di un canale FTP protetto da un proxy vengano inviate prima di tutto le informazioni username e password.

Per testare se funzionano puoi metterle in una parte qualunque del codice sorgente che preceda l'apertura della connessione. Poi fai in modo collegarti all'host protetto che hai passato alla proprietà di sistema.

Verificato che funzioni non ti resta che integrare nel tuo programma un qualunque tipo di interazione con l'utente che permetta allo stesso di inserire username e password quando la connessione passi attraverso un proxy server FTP (una finestra di dialogo che chieda username e password) oppure la richiesta iniziale di username e password per l'host protetto a cui ti collegherai.

Purtroppo non ricordo più dove ho pescato questo sistema per passare attraverso un proxy, altrimenti ti passerei il link.

Appena ho un attimo provo anch'io a vedere se funziona.

Ciao,

SteR9
04-07-2003, 06:47
ho fatto così:

try {
Properties p=System.getProperties();
p.put( "ftpProxySet", "true" );
p.put("ftpProxyHost", "194.63.229.137" );
p.put( "ftpProxyPort", "80" );
p.put( "ftpProxyUserName", "");
p.put( "ftpProxyPassword", "");
smtpSocket = new Socket("62.152.43.744", 6667);
os = new PrintStream(smtpSocket.getOutputStream());
is = new DataInputStream(smtpSocket.getInputStream());

} catch (UnknownHostException e) {
System.err.println("Don't know about host: hostname");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: hostname");
}

però mi da questo errore

cannot resolve symbol
symbol : class Properties
location: class smtpClient
Properties p=System.getProperties();
^

Properties cos'è??perchè mi da errore?[/b]

PGI
04-07-2003, 11:52
Properties è parte del package java.util

Come hai fatto è ok.

SteR9
04-07-2003, 12:14
ok lo compila ma nn va...mi connette senza proxy...
non è che devo passare qualche parametro al socket??

PGI
04-07-2003, 12:48
Azz, mi ero dimenticato che usi un Socket e non un URL.

rimuovi tutta la robaccia che ti ho fatto mettere nel codice e scrivi quest'altra.

System.setProperty("socksProxyHost", "nomehost");

Dovrebbe impostare i socket per usare il proxy.
Io sono alla frutta, se non funge... :cry:

Ciao.

SteR9
04-07-2003, 15:58
Originally posted by "PGI"

Azz, mi ero dimenticato che usi un Socket e non un URL.

rimuovi tutta la robaccia che ti ho fatto mettere nel codice e scrivi quest'altra.

System.setProperty("socksProxyHost", "nomehost");

Dovrebbe impostare i socket per usare il proxy.
Io sono alla frutta, se non funge... :cry:

Ciao.
non va :cry: io ho messo prima quello e poi la stringa che mi crea il socket...ma non va :cry:

PGI
04-07-2003, 16:15
Per curiosità che versione di Java usi?
Questo non dovrebbe succedere, perchè i socket java anche senza impostare la JVM, di default passano per il canale proxy del sistema in uso (se presente).

Prova da impostare anche la porta proxy con

System.setProperty("socksProxyPort","numeroporta");

Il bello è che in teoria avrebbe dovuto essere un "andare a colpo sicuro" :confused:

http://java.sun.com/j2se/1.4.1/docs/guide/net/properties.html#socks

SteR9
04-07-2003, 16:45
Originally posted by "PGI"

Per curiosità che versione di Java usi?
Questo non dovrebbe succedere, perchè i socket java anche senza impostare la JVM, di default passano per il canale proxy del sistema in uso (se presente).

Prova da impostare anche la porta proxy con

System.setProperty("socksProxyPort","numeroporta");

Il bello è che in teoria avrebbe dovuto essere un "andare a colpo sicuro" :confused:

http://java.sun.com/j2se/1.4.1/docs/guide/net/properties.html#socks
forse devo specificare se uso un sock4 socks5 o proxy...come faccio a specificarlo?

PGI
04-07-2003, 17:21
Non funziona esattamente così, quella prorietà imposta il server proxy per tutti i socket creati a runtime e gestiti dalla JVM.

Il server proxy può essere sia "v4 che v5" Non ho la più pallida idea di che differenza ci sia tra un server proxy Socks v4 e v5 ma la jvm li gestisce entrambi indifferentemente.

PGI
04-07-2003, 17:38
Alla bersagliera!

Se non va così vengo a mangiarmi il proxy!


System.getProperties().put("proxySet", "true");
System.setProperty("socksProxyPort","porta proxy");
System.setProperty("socksProxyHost","server proxy");
System.getProperties().put("ftpProxySet", "true");
System.getProperties().put("http.proxyHost", "server proxy");
System.getProperties().put("http.proxyPort", "porta proxy");
System.getProperties().put("https.proxyHost", "server proxy");
System.getProperties().put("https.proxyPort", "porta proxy");
System.getProperties().put("ftpProxyHost", "server proxy");
System.getProperties().put("ftpProxyPort", "porta proxy");


Questo abilita il passaggio dei flussi di qualunque connessione in partenza e in arrivo usate da java attraverso i (o il) proxy identificati dalle stringhe "porta proxy" e "server proxy" che si tratti di connessioni http,https, ftp, socket v5 e v4.

Mi aspetto un messaggio del tipo "accidenti adesso funziona" :D

SteR9
04-07-2003, 18:47
Originally posted by "PGI"

Alla bersagliera!

Se non va così vengo a mangiarmi il proxy!


System.getProperties().put("proxySet", "true");
System.setProperty("socksProxyPort","porta proxy");
System.setProperty("socksProxyHost","server proxy");
System.getProperties().put("ftpProxySet", "true");
System.getProperties().put("http.proxyHost", "server proxy");
System.getProperties().put("http.proxyPort", "porta proxy");
System.getProperties().put("https.proxyHost", "server proxy");
System.getProperties().put("https.proxyPort", "porta proxy");
System.getProperties().put("ftpProxyHost", "server proxy");
System.getProperties().put("ftpProxyPort", "porta proxy");


Questo abilita il passaggio dei flussi di qualunque connessione in partenza e in arrivo usate da java attraverso i (o il) proxy identificati dalle stringhe "porta proxy" e "server proxy" che si tratti di connessioni http,https, ftp, socket v5 e v4.

Mi aspetto un messaggio del tipo "accidenti adesso funziona" :D
dovrebbe funzionare...il problema è che ho scoperto che il proxy di fastweb non funziona :cry: e non ho un altro proxy con cui provare...

PGI
04-07-2003, 22:05
Per vedere puoi provare a scaricare un proxy da internet

Il primo che ho trovato per windows
qua (http://www.easyproxy.com/en/content/ezproxy/download.htm)

poi puoi rimuoverlo.