View Full Version : [java] Network Monitor
ciao a tutti, devo realizzare un progetto di network monitor per monitorare le prestazioni di una rete... tra le funzioni richiesta vi è un test di velocita di trasmissione dati... l'architettura è formata da un server e da vari Client dislocati sulle varie macchine che compongono la rete... la mia domanda è come posso far comunicare due client senza passare per il server al quale sono connessi???
devo creare una nuova serversocket??
grazie in anticipo
OS : win
nuovoUtente86
01-06-2010, 17:21
il test del throughput visto dal livello applicazione lo puoi fare in java attraverso i socket. Se ti interessano invece statistiche dei livelli più bassi devi poggiarti alle API del SO.
Quanto al tipo di architettura, se client/server o p2p dipende dalle tue specifiche esigenze, ma questo poco interessa poi ai fini della scelta del livello trasporto e quindi dell' implementazione in JAVA.
si anche io volevo farlo attraverso le socket, ma non riesco a mettere in contatto tra di loro due client? devo per caso creare una ServerSocket su uno dei client?
grazie per la risposta
nuovoUtente86
01-06-2010, 17:31
si anche io volevo farlo attraverso le socket, ma non riesco a mettere in contatto tra di loro due client? devo per caso creare una ServerSocket su uno dei client?
grazie per la risposta
si per instaurare una connessione TCP c'è bisogna che una delle 2 entità coinvolte faccia binding su una porta.
ho fatto una prova...allora la situazione è questa:
Server e client1 sono sulla stessa macchina
client2 è su un'altra;
la serversocket la crea client1, però quando in client2 mi vado a connettere attraverso Socket s = new Socket(nomepc,porta) mi da errore (connection timeout), mentre se uso Socket s = new Socket(IP,porta) funziona .
cosa pensate possa essere?
nuovoUtente86
01-06-2010, 17:44
se passi un riferimento mnemonico all' host, devi essere sicuro che l' infrastruttura di rete sia in grado di risolverlo, in questo caso attraverso netbios o un local DNS.
a quanto pare non ho chiare delle cose sulle socket.... perchè se io su entrambe i client faccio
InetAddress address = InetAddress.getByName(nome pc);
System.out.println(address);
il risultato della sistem.out è sempre lo stesso in entrambe i casi.... :S cambia solo il nome del pc ma l'ip è lo stesso NOME PC/IP
nuovoUtente86
01-06-2010, 18:14
se tu metti localhost oppure il nome del pc-locale avrai sicuramente una risoluzione (almeno che non sia corrotto il file hosts). Se metti il nome di un altro pc, lavorando si windows al 99% riuscirai a risolverlo tramite netbios, ma se questi è disabilitato oppre la rete è mista è necessario che quel nome venga risolto da un DNS.
Ora credo il tuo caso rientri nelle ipotesi più semplici.
Alternativamente puoi creare all' interno del tuo protocollo un sistema proprietario di naming, in grado di associare ad un nome il corrispettivo host.
si il mio è il caso piu semplice...però non riesco ancora a capire una cosa...
perchè se faccio:
InetAddress address = InetAddress.getByName(nomePClocale);
System.out.println(address);
e
InetAddress ia = InetAddress.getLocalHost();
System.out.printlm(ia.getHostAddress());
nella stessa classe ottengo due IP diversi??? non dovrebbe essere identico
nuovoUtente86
01-06-2010, 18:30
uno ti restituisce l' indirizzo di loopback, l' altro quello dell' interfaccia di rete.
uno ti restituisce l' indirizzo di loopback, l' altro quello dell' interfaccia di rete.
e io quando creo la socket per la connessione verso laltro client devo usare quello di loopback e quindi il primo vero?
la mia difficoltà è nel reperire l'IP del client per metterlo nel primo campo del metodo socket...io del client ho a disposizione il nome
nuovoUtente86
01-06-2010, 18:39
devi utilizzare il primo, che non è quello di loopback.
Probabilmente ti è utile capire un po come funziona il protocollo ip (ed eventualmente trasporto), in modo da maneggiare meglio i Socket, che ne rappresentano un' astrazione.
grazie per i preziosi consigli, ho quasi risolto tutti i problemi tranne questo:
ho bisogno di convertire un indirizzo IP che ho sotto forma di stringa in oggetto InetAddress....come posso farE???
nuovoUtente86
02-06-2010, 09:40
come hai già fatto nei post precedenti va bene.
ho finalmente impostato la connessione UDP però quando vado a spedire un pacchetto dal client 1 al client 2 il pacchetto arriva solo nel caso 1->2 .
nel caso 2->1 il serverUDP rimane in attesa del pacchetto...
ho fatto delle prove e questo succede solo quando a fare da server è il client che non è in locale con il SERVERCENTRALE.
può essere che visto che è in locale la send arriva prima delle receive?
perfetto, ho risolto quasi tutto...!! grazie per i preziosissimi consigli!! ora mi manca solo costruire un grafo dove rappresentare la velocità di connessione tra i vari client....ma esiste qualche libreria grafica di java che faccia questo?
banryu79
03-06-2010, 08:30
ora mi manca solo costruire un grafo dove rappresentare la velocità di connessione tra i vari client....ma esiste qualche libreria grafica di java che faccia questo?
Prova a dare un'occhiata a JGraph o a JUNG.
Oppure prova a cercare in questa lista: http://www.dmoz.org/Science/Math/Combinatorics/Software/Graph_Drawing/
nuovoUtente86
03-06-2010, 09:27
ho finalmente impostato la connessione UDP però quando vado a spedire un pacchetto dal client 1 al client 2 il pacchetto arriva solo nel caso 1->2 .
nel caso 2->1 il serverUDP rimane in attesa del pacchetto...
ho fatto delle prove e questo succede solo quando a fare da server è il client che non è in locale con il SERVERCENTRALE.
può essere che visto che è in locale la send arriva prima delle receive?
In ogni caso, il test lo svilupperei su TCP, per dare un misura di reale utilizzo della connessione.
In ogni caso, il test lo svilupperei su TCP, per dare un misura di reale utilizzo della connessione.
li dovevo fare tutti e due, TCP e UDP, cmq ora ho risolto, mi funzionano tutti e due;)
In ogni caso, il test lo svilupperei su TCP, per dare un misura di reale utilizzo della connessione.
li dovevo fare tutti e due, TCP e UDP, cmq ora ho risolto, mi funzionano tutti e due;)
mio dio ora ogni volta che il client cerca di scrivere al server , dopo aver aperto la connessione con la socket mi esce questo errore:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
il fatto è che succede solo se faccio partire il client non in locale...mentre se faccio partire un client dallo stesso pc di dove parte il server va tutto ok....ha sempre funzionato e ora perchè fa cosi tutto dun tratto?
banryu79
07-06-2010, 08:07
Forse non è niente di che, guarda qua (http://www.google.it/#hl=it&source=hp&q=java.net.SocketException%3A+Connection+reset&aq=f&aqi=&aql=&oq=&gs_rfai=&fp=50fa2907fd313e9b).
Forse non è niente di che, guarda qua (http://www.google.it/#hl=it&source=hp&q=java.net.SocketException%3A+Connection+reset&aq=f&aqi=&aql=&oq=&gs_rfai=&fp=50fa2907fd313e9b).
si avevi ragione...tutto risolto...
una domanda...ma quando creo una connessione UDP e creo un oggetto DATAGRAMPACKET(byte dati[], int dim, InetAddress,int porta) , l'oggetto inet address melo calcolo tramite :
InetAddress ia = InetAddress.getByName(nomePcA)
tale chiamata va fatta necessariamente sul PC A (che è quello che deve ricevere) e in qualche modo poi inviato l'oggetto InetAddress o la posso fare anche sul PC B(che è quello che spedisce)? perchè ho provato a farle su tutti e due inserendo lo stesso nomePC e il risultato è diverso:
mi viene:
sul PCA ---> pippo/un ip
sul PCB ---> pippo/un altro ip
nuovoUtente86
10-06-2010, 12:50
La risposta è parzialmente contenuta nel post n 8. Per completarla, come esercizio, rifletti sul funzionamento di Ip.
La risposta è parzialmente contenuta nel post n 8. Per completarla, come esercizio, rifletti sul funzionamento di Ip.
ora funziona, praticamente ho prima ottenuto l'oggetto inetAddress in locale sul PC A e poi lho inviato al client che voleva connettersi al PC A.
però ancora non riesco a capire... ho capito solo che l'indirizzo di loopback è un indirizzo usato quando il pc non è connesso alla rete e quindi non ha un IP...ancora non riesco a capire perchè se usavo lo stesso nomePc dentro getByName() su due pc diversi appartenenti alla stessa rete mi dava due risultati diversi...:muro:
nuovoUtente86
10-06-2010, 14:40
posta il codice che utilizzavi e l' output ricevuto
posta il codice che utilizzavi e l' output ricevuto
usavo sempre questo su entrambi i pc.
InetAddress ia = InetAddress.getByName("pippo");
System.out.println(ia);
sul pc "pippo" mi dava pippo/192.168.0.100
su laltro pc usando sempre "pippo" nel campo di getByName() mi dava
pippo/212.etc etc ora non lo ricordo precisamente
la connessioen UDP ora funziona solo se uso il primo dei valori
nuovoUtente86
10-06-2010, 14:52
presumo uno dei Pc facesse da gateway, in quanto una delle chiamate restituiva un ip pubblico.
presumo uno dei Pc facesse da gateway, in quanto una delle chiamate restituiva un ip pubblico.
si hai ragione era cosi...
ho sviluppato tutto quello che mi serviva, ora mi manca solo una funzione ma sto in crisi, come implementereste un test di carico ad anello???
ovvero tutti i client connessi a un server devono spedirsi un pacchetto tcp e lultimo a ricevere deve essere il primo che ha spedito...e devo calcolare il tempo trascorso per attraversare tutti i client.....non voglio il codice ma solo capire come fare, ho fatto delle prove ma non riesco a farlo...
nuovoUtente86
11-06-2010, 16:37
Ogni nodo deve conoscere l' ip del suo vicino, cui passare il token. Per simulare il passaggio utilizzerei UDP o ICMP piuttosto che tcp. Alla fine ti interessa calcolare la latenza dell' anello, quindi ha poco senso aggiungere il tempo impiegato per gli handshake.
Ogni nodo deve conoscere l' ip del suo vicino, cui passare il token. Per simulare il passaggio utilizzerei UDP o ICMP piuttosto che tcp. Alla fine ti interessa calcolare la latenza dell' anello, quindi ha poco senso aggiungere il tempo impiegato per gli handshake.
ok i preziosi consigli hanno dato i frutti sperati...ho sviluppato anche questo...ora però forse la parte piu difficile...io devo sviluppare l'interfaccia...dovrei usare servlet , jsp tramite pagina web...
ora la mia situazione è questa:
una classe admin che si connette a un server inviandogli le richieste questo poi attraverso i thread dei clientDistribuiti e dell'admin calcola i vari risultati e li invia all'admin che li visualizza....
io ora faccio tutto tramite console...come posso fare per creare una servlet? devo modificare la classe admin e includere una servlet li dentro o devo fare una nuova classe?? in quest'ultimo caso come faccio a far comunicare servlet e admin?? non ho nessuna esperienza con le servlet, finora sono solo riuscito a installare tomcat e a far partire delle semplici servlet che stampano stringhe trovate su internet....
sapreste aiutarmi?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.