Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JAVA] MultiThread - CLient Server - Synchronizedd

    Ragazzi In pratica vorrei che funzionasse Che inserisco tramite il primo thread i 3 campi di una persona e li invia al server , nel frattempo parte il 2 thread che aspetta e parte appena il primo finisce. Mi fa inserire altri 3 campi della persona e li invia al server.

    Se io metto per la persona uno 3 campi fissi dal codice funziona la concorrenza mentre se lo metto con l'inserimento dei singoli campi tramite BufferedReader e quindi con readdLine accade questo:

    I primi 3 valori della prima persona del primo thread me li fa inserire e il server li riceve , poi mi aspetterei che mi richiede altri 3 campi il secondo thread per poi inviare la seconda persona al server ma non accade questo.
    Infatti appena il server riceve la prima persona dal lato client invece accade che il secondo thread parte e mi chiede di inserire solo un campo della seconda persona ma neanche il tempo di apparire il messaggio poi mi dice oggetto inviato , e il server riceve i 3 campi pero' inizializzati a default.

    Io penso il problema si quindi nel BufferedReader , tramite il readLine. Ma non so come risolverlo.

    Help Me Please ! [Non capisco perchè non posso allegare il .zip contenente tutti i file direttamente qui =( ] Quindi pubblico qui il codice:

    codice:
    //CallMe.java
    import java.io.*;
    import java.net.*;
    
    public class CallMe {
    	
    public synchronized void call () {
    		try {
    		
    		Socket socket = new Socket("localhost",65535);
    		Thread t = Thread.currentThread();
    		System.out.println("Sono il Thread: " + t.getId() + " Connessione Effettuata");
    		
    		ObjectOutputStream OOS = new ObjectOutputStream (socket.getOutputStream());
    		
    		Oggetto oggetto = new Oggetto();
    		OOS.writeObject(oggetto);
    		System.out.println("Scrittura Oggetto Effettuata");
    		OOS.close();
    		
    		}
    		catch (UnknownHostException uhe) {}
    		catch (IOException ioe) {}
    		//catch (InterruptedException ie) {}
    	}
    }
    --------------------------------------------------------------------------------------
    Client.java
    import java.io.*;
    import java.net.*;
    
    public class Client implements Runnable {
    	public CallMe target;
    	
    	public Client (CallMe t) {
    		target = t;
    		new Thread(this).start();
    	}
    	
    	public static void main (String args []) {
    		CallMe target = new CallMe();
    		new Client(target);//Creo Primo Thread
    		new Client(target);//Creo Secondo Thread
    	} //chiude il main
    	
    	public void run () {
    		
    		synchronized (this) {
    		
    		this.target.call();
    		
    		}
    	}
    	
    }
    -------------------------------------------------------------------------------------
    Oggetto.java
    import java.io.*;
    import java.net.*;
    
    public class Oggetto implements Serializable {
    	String nome;
    	int eta;
    	String cognome;
    	
    	public Oggetto () {
    		try {
    		BufferedReader BR = new BufferedReader ( new InputStreamReader (System.in) );
    		System.out.println("Inserisci Nome: ");
    		nome=BR.readLine();
    		System.out.println("Inserisci Eta': ");
    		eta=Integer.parseInt(BR.readLine());
    		System.out.println("Inserisci Cognome: ");
    		cognome=BR.readLine();
    		BR.close();
    		}
    		catch (IOException ioe) {}
    		
    		
    		
    	}
    	
    	public String toString () {
    		String temp="";
    		temp+="Nome: " + nome;
    		temp+=" Eta': "+ eta;
    		temp+=" Cognome: "+ cognome;
    		return temp;
    	}
    }
    ----------------------------------------------------------------------------------
    Server.java
    import java.net.*;
    import java.io.*;
    
    public class Server {
    	public static void main (String args[]) {
    		try {
    			ServerSocket portaServer = new ServerSocket (65535);
    			boolean continua = true;
    			while (continua) {
    				
    				Socket socket = portaServer.accept();
    				//Connessione Accettata 
    				ObjectInputStream OIS = new ObjectInputStream (socket.getInputStream());
    				Oggetto oggetto = null;
    				oggetto = (Oggetto)OIS.readObject();
    				System.out.println("Ho recuperato l'oggetto");
    				System.out.println(oggetto);
    				OIS.close();
    			}
    		}
    		catch (IOException ioe) {}
    		catch (ClassNotFoundException cnfe) {}
    	}
    }
    Help Me pleAse !

  2. #2
    oPS. scusate non mi sono presentato , sono nuovo del forum , studio ingegneria e questo è il mio primo post. Spero riuscirete ad aiutarmi. Grazie Mille =)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    visto che sei nuovo un occhio al regolamento non guasta, scrivi il codice tra i tag code (mantiene l'indentatura e aiuta anche solo a guardarlo).

    In dettaglio quale è l'errore?
    E il Client?
    RTFM Read That F*** Manual!!!

  4. #4
    Ho provato ad editarlo con il tag code , ma mi dice che solo entro 60 minuti è editabile e poi non posso più.
    Cmq grazie per il consiglio =) ! Ho letto anche un po' in giro discussioni simili sul forum ma nn riguardavano proprio questo problema che ho io.

    In pratica non ha errori di compilazione il codice è eseguibile e non vengolo lanciate eccezioni.

    L'unico problema è che non fa quelllo che vorrei io.

    Funzionamento che vorrei
    Client mi chiede di inserire i 3 campi di Oggetto e poi li invia al server che li riceve , subito dopo il secondo thread del Client parte e mi chiede la stessa cosa per un nuovo oggetto e li invia al server che li riceve

    Funzionamento che invece mi fa il programma e che non vorrei
    Il primo thread parte , mi chiede i 3 campi invia l'oggetto e il server lo riceve , e fino a qua perfetto.
    Poi parte il secondo thread , mi chiede di inserire un solo campo dell'oggetto , e manco faccio in tempo a inserire il primo campo che mi dice oggetto inviato , ed il server riceve Nome=null eta=0 e Cognome= null

    Ciao Valia ! =)

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    manca il Client....e nel Server quale è il thread che si occupa dell'acquisizione dei dati?
    Chiedi al mod di sistemare la discussione
    RTFM Read That F*** Manual!!!

  6. #6
    Io ho postato i 4 files, callme.java , client.java, server.java ,oggetto.java.

    Callme è la classe che contiene il metodo call, che è chiamato dal thread del client dal suo run.

    Il metodo call stabilisce la connessione con il server e crea l'oggetto di tipo Oggetto , una volta che il costruttore di Oggetto mi ha fatto inserire i 3 parametri nome , eta' , cognome , poi nella funzione call tramite lo stream della socket e l'object output stream invia l'oggetto sullo stream , che puntualmente viene ricevuto dal server.

    Nel server ho fatto tutto nel main , perchè ho pensato che per quello che dovevo fare bastava farlo direttamente sul main .

    Cosa intenddi quindi per manca il server , e manca il client ?

    P.s. Ho mandato l'email all'amministratore per la richiesta di modifica del post.

  7. #7
    Originariamente inviato da AlienLearn
    Ho provato ad editarlo con il tag code , ma mi dice che solo entro 60 minuti è editabile e poi non posso più.
    fatto, saluti

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    per come imposto io problemi di client/server, è il server ad avere thread, non il client.
    Mi spiego. Il server offre un servizio, quindi riceve una richiesta, la esegue e serve la successiva. Se è un unico thread, non può riceve altre richieste finché non ha finito la prima, allora non funzionerebbe niente!!!
    Il server invece riceve una richiesta e crea un thread in grado di gestirla, rimettendosi in ascolto della prox richiesta.
    La sincronizzazione avverrà su risorse comuni (come es l'accesso a file e/o db).

    Il client....è unico, non ha thread!!!
    Se vuoi simulare più richieste devi avviare più client!!!
    Forse c'è qualche errore architetturale (Che adesso si nota meglio).
    Mi stai seguendo?
    RTFM Read That F*** Manual!!!

  9. #9
    Si si ho capito cosa vuoi dire , ok , quindi devo modificare il lato server e creare un thread server per ogni connessione.

    Io dal lato client creavo più thread per simulare la connessione di più client in una volta sola , invece che aprire ogni volta un terminale e lanciare un client tramite java Client.

    Quindi per quanto riguarda il server è da aggiustare (Grazie =) ), e per il Client questo discorso che ho fatto dove invece di aprire più esecuzioni di un client da ogni terminale , creo un solo client che però manda più thread è sbagliato anche ?

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    per me non è logicamente corretto, puoi simulare così...viene fatto per i test (stress test soprattutto).
    L'importante è che ricordi che è una simulazione, non la realtà.
    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.