Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    100

    [java]client e user chat

    ciao devo implementare con protoccolo UDP una specie di chat via shell
    : (CLIENT E SHELL VENGONO MANDATI IN ESEC SU DUE SHELL DIVERSE)
    - il client viene mandato in esec con i seguenti argomenti
    java clientmsn portaserver portaclient
    cosa fa il client?
    -il client manda un pacchetto contenete un intero(la propria porta di ascolto) al server(lavoriamo su local host sia x server che client) che è in ascolta in portaserver.
    - il server viene lanciato cosi
    java servermsn portaserver
    cosa fa il server?
    aspetta un pacchetto con la porta in ascolto del client

    dopo di che server e client iniziano a comunicare via shell come se fosse una vera e propria chat.
    per la ricezione e invio ho pensato di creare 2 thread e farli partire entrambi sia sull host che sul server
    nel codice del client e server troverete l uso di due classi assegnate dal prof
    Input(utilizzo il metodo readline per leggere la stringa da linea di comando)
    e
    Obj2DP che fornisce due metodi statici:
     public static Object dp2obj(DatagramPacket dp)
    che restituisce l'oggetto contenuto nel pacchetto passato per
    argomento, deserializzandolo
     public static DatagramPacket obj2dp(Object obj)
    che restituisce un pacchetto contenente l'oggetto passato per
    argomento, serializzato, nel payload.


    ora vi posto il codice del mio server e client




    vi posto il codiceserver
    codice:
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    
    public class servermsn {
    	public static void main(String []args){
    		int porta_server=Integer.parseInt(args[0]);
    		try {
    			DatagramSocket server_ric=new DatagramSocket(porta_server);
    			DatagramSocket server_inv=new DatagramSocket();
    			byte[]buffer=new byte[512];
    			DatagramPacket dp = new DatagramPacket(buffer,buffer.length);
    			server_ric.receive(dp);
    			Object port=Obj2DP.dp2obj(dp);
    			int porta_client=(Integer) port;
    			System.out.println("inizio comunicazione");
    			while(true){
    				Thread_recapitasms t2=new Thread_recapitasms(server_ric);
    				Thread_inviasms t1=new Thread_inviasms(porta_client,server_inv);
    		
    				t2.start();
    				t1.start();
    				
    			}
    		
    		
    		
    		} catch (SocketException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }


    e codice client

    codice:
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    
    public class clientmsn {
    public static void main(String []args){
    	int portaserver=Integer.parseInt(args[0]);
    	int portaclient=Integer.parseInt(args[1]);
    	try {
    		DatagramSocket client_ric=new DatagramSocket(portaclient);
    		DatagramSocket client_inv=new DatagramSocket();
    		InetAddress ia = InetAddress.getLocalHost();
    		DatagramPacket dp=Obj2DP.obj2dp(portaclient);
    		dp.setAddress(ia);
    		dp.setPort(portaserver);
    		client_inv.send(dp);
    		while(true){
    			Thread_inviasms t1=new Thread_inviasms(portaserver,client_inv);
    			Thread_recapitasms t2=new Thread_recapitasms(client_ric);
    			t1.start();
    			t2.start();
    		}
    	} catch (SocketException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (UnknownHostException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	
    }
    }

    ecco il codice dei thread utilizzati per invio e ricezione


    X L INVIO:
    codice:
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    
    public class Thread_inviasms extends Thread {
    	int porta;
    	DatagramSocket ds;
    	public Thread_inviasms(int porta,DatagramSocket ds){
    		this.ds=ds;
    		this.porta=porta;
    	}
    	public void run(){
    		try {
    			
    			InetAddress ia = InetAddress.getLocalHost();
    			while(true){
    				String mex=Input.readLine();
    				DatagramPacket dp=Obj2DP.obj2dp(mex);
    				dp.setAddress(ia);
    				dp.setPort(this.porta);
    				ds.send(dp);
    ;
    			}
    		} catch (SocketException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    }

    X LA RICEZIONE
    codice:
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    
    public class Thread_recapitasms extends Thread {
    	DatagramSocket ds;
    	public Thread_recapitasms(DatagramSocket ds){
    		this.ds=ds;
    
    	}
    	public void run(){
    		DatagramPacket dp = new DatagramPacket(new byte[512],512);
    		while(true){
    			try {
    				ds.receive(dp);
    				Object res=Obj2DP.dp2obj(dp);
    				String sms=(String) res;
    				System.out.println(sms);
    
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} // receive packet
    			catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    
    		}
    	}
    }

    IL PROGRAMMA FUNZIONA CORRETTAMENTE PERO PRIMA DEI MESSAGGI DI CHAT SIA SULLA SHELL DEL CLIENT E SIA SULLA SHELL DEL SERVER CÈ IL SEGUENTE MESSAGGIO

    Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:614)
    at servermsn.main(servermsn.java:23)
    df

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e hai cercato di capire che errore è?
    il codice lo hai scritto tu?
    sembra che qualcosa nel tuo codice usi tutta la memoria disponibile e non riesca quindi ad istanziare ciò che a te interessa

  3. #3
    Se non ricordo male, ad ogni invio di messaggio dovresti chiudere la socket in maniera esplicita, (socket.close()).... stai lavorando con socket Datagram , non stabilisci una connessione tra le due shell coinvolte nella chat, quindi ogni volta ricrei la socket senza liberare le risorse che la precedente aveva occupato! Con la chiusura esplicita liberi le risorse e non dovresti avere problemi nella memoria!

  4. #4
    Scusate ma :
    codice:
    System.out.println("inizio comunicazione");
    			while(true){
    				Thread_recapitasms t2=new Thread_recapitasms(server_ric);
    				Thread_inviasms t1=new Thread_inviasms(porta_client,server_inv);
    		
    				t2.start();
    				t1.start();
    				
    			}
    Un codice del genere come fa a non andare in out of memory....
    Crei più Thread in questo programma che io in tutti i programmi che ho fatto....
    Perchè una cosa del genere, a cosa ti servono ?

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da francesco.muia
    Scusate ma :
    codice:
    System.out.println("inizio comunicazione");
    			while(true){
    				Thread_recapitasms t2=new Thread_recapitasms(server_ric);
    				Thread_inviasms t1=new Thread_inviasms(porta_client,server_inv);
    		
    				t2.start();
    				t1.start();
    				
    			}
    Un codice del genere come fa a non andare in out of memory....
    Crei più Thread in questo programma che io in tutti i programmi che ho fatto....
    Perchè una cosa del genere, a cosa ti servono ?
    personalmente se mi dici che hai un problema, quanto meno devi dirmi che problema hai, in modo da isolare il codice da analizzare. A priori non guardo tutto quel codice, scelta opinabile, ma sapere dove del codice va in errore spesso aiuta noi a capire subito quello che succede

    Complimenti per la pazienza
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.