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

    [java] semplice chat su shell

    TESTO PROBLEMA:
    S i realizzino un Server e un Client UDP che realizzano un semplice
    Instant Messanger: ogni linea scritta nella shell del Server viene copiata
    nella shell del Client e viceversa. La trasmissione delle linee inizia dopo
    una semplice fase di handshaking, descritta di seguito.
     Il Server viene lanciato da shell, fornendo il numero di porta su
    cui ricevere i pacchetti UDP.
     Il Client viene lanciato da un'altra shell (eventualmente su un
    altro computer), fornendo host e porta del Server e porta locale
    su cui ricevere pacchetti UDP.
     Il Client manda una richiesta di connessione al Server, indicando
    nel messaggio la propria porta. Se non riceve un messaggio di ack
    entro 3 secondi, riprova a mandare la richiesta altre 5 volte, poi
    termina. Se invece riceve l'ack, inizia la trasmissione delle linee
    scritte nella shell locale e la ricezione e stampa delle linee scritte
    nella shell del Server.

    ----------------------------------------------------------------------------------------------------------------
    CLASSE SERVER MSN:

    codice:
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    
    public class Servermsn {
    	public static void main(String []args){
    		int porta=Integer.parseInt(args[0]);// porta in cui il server è in attesa
    		try {
    			DatagramSocket ds=new DatagramSocket(porta);
    			DatagramPacket dp = new DatagramPacket(new byte[512],512);
    			ds.receive(dp); // ricevo pacchetto che contiene la porta del client in ricezione
    			Object res=Obj2DP.dp2obj(dp);
    			int portaclient=(Integer) res;
    			DatagramPacket ack = new DatagramPacket(new byte[512],512);
    			ack.setAddress(InetAddress.getLocalHost());
    			ack.setPort(portaclient);
    			ds.send(ack);
    			while(true){
    				Thread_recapitasms t1=new Thread_recapitasms(ds);
    				Thread_inviasms t2= new Thread_inviasms(portaclient);
    				t1.start();
    				t2.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();
    		}
    
    	}
    }

    CLASSE 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.SocketTimeoutException;
    import java.net.UnknownHostException;
    
    
    public class clientmsn {
    	public static void main(String[]args){
    		int portaserver=Integer.parseInt(args[0]);
    		int i=0;
    		boolean b=false;
    		try {
    			DatagramSocket ds = new DatagramSocket(Integer.parseInt(args[1]));
    			InetAddress ia = InetAddress.getLocalHost();
    			DatagramPacket dp=Obj2DP.obj2dp(Integer.parseInt(args[1]));
    			dp.setAddress(ia);
    			dp.setPort(portaserver);
    			ds.send(dp);//invio la porta in ascolto del client al server
    			//faccio 5 tentativi di connessione b=true quando mi arriva l ack
    			do{
    				try{
    
    					byte [ ] buffer = new byte [200];
    					DatagramPacket ack = new DatagramPacket(buffer, buffer.length);
    					ds.setSoTimeout(3000);
    					ds.receive(ack);
    					b=true;
    					ds.setSoTimeout(0);
    
    				}
    				catch (SocketTimeoutException e){
    					i++;
    					System.out.println(i+"tentativo di connessione a vuoto");
    				}
    			}while((i<=5)&&(b==false));
    			if(b==true){
    				Thread_inviasms t1=new Thread_inviasms(porta); 
    				Thread_recapitasms t2=new Thread_recapitasms(ds);
    				t1.start();
    				t2.start();
    			}else
    				System.out.println("tutti i tentativi andati a vuoto");
    		} 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();
    		}
    
    	}
    }
    uso una classe Input per leggere da linea di comando che è funzionante xche consegnata dal prof
    uso una classe Obj2DP che fornisce due metodi statici(anch essa fornita dal prof:
    -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.


    infine il server e il client fanno uso di due thread che mi servono uno per l invio e uno per la ricezione
    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();
    			}
    
    		}
    	}
    }
    x invio mex:
    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;
    	public Thread_inviasms(int porta){
    		this.porta=porta;
    	}
    	public void run(){
    		try {
    			DatagramSocket ds = new DatagramSocket();
    			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();
    		}
    
    	}
    
    }


    lancio prima il programma servermsn con argomento la proprio porta in ascolto
    ex: javac servermsn 24309
    lancio il client cona rgomento porta server e propria porta in ascolto
    ex:javac clientmsn 24309 24310
    che succede?
    finche non scrivo qualcosa nella chat del client ho uno spam di errori sulla shell del server
    poi quando scrivo esempio ciao
    nella shell dl server arriva la parola ciao e i due iniziano a parlare correttamente
    da dove provengano quei messaggi di errore?
    df

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    100
    x chi volesse eseguire vi passo anche la classe input e Obj2DP

    input:
    codice:
    import java.io.BufferedReader;
    
    import java.io.InputStreamReader;
    
    import java.io.IOException;
    
    
    
    /** 
    
        Una semplice classe per leggere stringhe e numeri 
    
        dallo standard input.
    
    */
    
    
    
    public class Input{
    
        
    
        private static BufferedReader reader = 
    
    	new BufferedReader(new InputStreamReader(System.in));
    
        
    
        /**
    
           Legge una linea di input. Nell'improbabile caso di una
    
           IOException, il programma termina. 
    
           @return restituisce la linea di input che l'utente ha battuto.
    
        */
    
        public static String readLine(){  
    
    	String inputLine = "";
    
    	try{  
    
    	    inputLine = reader.readLine();
    
    	}
    
    	catch(IOException e){  
    
    	    System.out.println(e);
    
    	    System.exit(1);
    
    	}
    
    	return inputLine;
    
        }
    
        
    
        /**
    
           Legge una linea di input e la converte in un intero.
    
           Eventuali spazi bianchi prima e dopo l'intero vengono ignorati.
    
           @return l'intero dato in input dall'utente
    
        */
    
        public static int readInt(){  
    
    	String inputString = readLine();
    
    	inputString = inputString.trim();
    
    	int n = Integer.parseInt(inputString);
    
    	return n;
    
        }
    
       
    
        /**
    
           Legge una linea di input e la converte in un numero
    
           in virgola mobile.  Eventuali spazi bianchi prima e
    
           dopo il numero vengono ignorati.
    
           @return il numero dato in input dall'utente 
    
        */
    
        public static double readDouble(){  
    
    	String inputString = readLine();
    
    	inputString = inputString.trim();
    
    	double x = Double.parseDouble(inputString);
    
    	return x;
    
        }
    
       
    
        /**
    
           Legge una linea di input e ne estrae il primo carattere.  
    
           @return il primo carattere della riga data in input dall'utente 
    
        */
    
        public static char readChar(){  
    
    	String inputString = readLine();
    
    	char c = inputString.charAt(0);
    
    	return c;
    
        }
    
    }
    e l altra
    codice:
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.DatagramPacket;
    
    
    public class Obj2DP {
    	//restituisce l'oggetto contenuto nel datagram packet	
    	public static Object dp2obj(DatagramPacket dp) throws IOException, ClassNotFoundException{
    		ByteArrayInputStream bais =
    			new ByteArrayInputStream(dp.getData(),dp.getOffset(),dp.getLength());
    		ObjectInputStream ois = new ObjectInputStream(bais);
    		return ois.readObject();
    
    
    	}
    	//restituisce un pacchetto contente l oggetto passato x argomento
    	public static DatagramPacket obj2dp(Object obj) throws IOException{
    		ByteArrayOutputStream bout = new ByteArrayOutputStream();
    		ObjectOutputStream oout = new ObjectOutputStream(bout);
    		oout.writeObject(obj);
    		byte[] arr = bout.toByteArray();
    		DatagramPacket dp = new DatagramPacket(arr,arr.length);
    		return dp;
    
    	}
    }

    PLEASE HELP ME
    df

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    finche non scrivo qualcosa nella chat del client ho uno spam di errori sulla shell del server
    e che riportano?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    100
    HO SEMPLIFICATO IL PROBLEMA E L HO DESCRITTO ACCURATAMENTE SU QUESTO POST
    http://forum.html.it/forum/showthrea...readid=1438634
    df

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Originariamente inviato da esoni
    HO SEMPLIFICATO IL PROBLEMA E L HO DESCRITTO ACCURATAMENTE SU QUESTO POST
    http://forum.html.it/forum/showthrea...readid=1438634
    In tal caso, in futuro evita di aprire più discussioni sullo stesso argomento.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.