Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [JAVA] Socket tcp su server multithreaded

    salve ragazzi,
    vi prego cortesemente di leggere un attimo questo topic, per risolvere un problemino che mi sta facendo scervellare.
    allora, vorrei implementare un'applicazione client server, con socket tcp e server multithreaded che consenta al server di leggere una stringa inviata dal client, e di replicare con la stringa medesima convertita in maiuscolo.
    ho suddiviso l'intero codice in due package, uno per il client, l'altro per il server.
    vi comincio a riportare il codice del server.
    ho implementato 2 classi, chiamate rispettivamente server e main.
    vi posto sotto il codice

    codice:
    // class server
    
    package server;
    
    import java.net.*;
    import java.io.*;
    
    public class server {
    	private ServerSocket socket_server;
    	private Socket socketclient;
    	private int numport;
    	
    	server(int num) {
    		this.numport=num;
    		try{
    		socket_server = new ServerSocket(this.numport,100);		// max 100 connessioni
    		} catch(IOException e) {e.printStackTrace();}
    	}
    	
    	public void funzionamento() {
    		System.out.println("server in funzione");
    		while(true) {
    			try{
    				socketclient = socket_server.accept();
    				System.out.println("connessione con un client accettata");
    				// il server crea un apposito thread per gestire questo client
    				serverparallelo p = new serverparallelo(socketclient);
    				Thread t = new Thread(p);
    				t.start();
    			}
    			catch(IOException e) {e.printStackTrace();}
    		}			// end while
    	}				// end funzionamento()
    	
    	
    	// implementiamo la classe interna che emula il thread
    	
    		protected class serverparallelo implements Runnable {
    			private Socket socket;
    			private BufferedReader dalclient;
    			private PrintStream alclient;
    			
    			serverparallelo(Socket s) {
    				this.socket=s;
    			}
    			
    			public void run() {
    				try{	
    				dalclient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    				alclient = new PrintStream(socket.getOutputStream());
    				String letto = dalclient.readLine();
    				String risposta = letto.toUpperCase();
    				//invia risposta al client
    				alclient.println(risposta);
    				
    				alclient.close();
    				dalclient.close();
    				socket.close();
    				}
    				catch(IOException e) {e.printStackTrace();}
    			}	// end run()
    		};		// end inner class
    
    
    // classe main
    
    package server;
    
    public class main {
    	public static void main(String[] args) {
    	
    		server s = new server(7777);
    		s.funzionamento();
    	}
    
    }
    
    }

    molto semplicemente, nella classe server ho creato una classe interna che implementa un thread. ogni volta che arriva la connessione di un client, creo una socket(restituitami da server_socket.accept() ), e lascio al thread la gestione dei flussi verso la socket del client

    ora vi posto il codice del package client. sono 2 classi, rispettivamente main e client

    codice:
    // classe client
    
    package client;
    
    import java.net.*;
    import java.io.*;
    
    public class client {
    	
    	private int numport;
    	private Socket client;
    	private BufferedReader dalserver;
    	private PrintStream alserver;
    	private static int contatore=0;
    	
    	client (int numport) {
    		this.numport=numport;
    		try{
    		client = new Socket(InetAddress.getLocalHost(),this.numport);
    		System.out.println("sono il client " + contatore);
    		dalserver = new BufferedReader(new InputStreamReader(client.getInputStream()));
    		alserver = new PrintStream(client.getOutputStream());
    		}
    		catch(IOException e) {e.printStackTrace();}
    
    	}
    	
    	
    	public void funzionamento () {
                    System.out.println("digitare frase da convertire");
    		BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
    		String frase = b.readLine();
    		try{
    		// invio il messaggio al server
    		alserver.println(frase);
    		// ricevo una risposta che memorizzo in risposta
    		String risposta = new String(dalserver.readLine());
    		System.out.println("il client " + contatore++ + "ha ricevuto dal server " + risposta);
    		
    		// chiudo i flussi
    		dalserver.close();
    		alserver.close();
    		client.close();
    		}
    		catch(IOException e) {e.printStackTrace();}
    		
    		
    	}
    
    }
    
    
    // classe main
    
    package client;
    
    import java.io.*;
    
    public class main {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		
    		client c = new client(7777);
    		
    	}
    
    }

    ma dopo svariati tentativi, sempre lo stesso esito: il server funziona correttamente, e si mette in ascolto.
    il client invece, una volta compilato, ecco l'output che si produce a console:

    codice:
    server in funzione
    connessione con un client accettata
    java.net.SocketException: Connection reset
    	at java.net.SocketInputStream.read(Unknown Source)
    	at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    	at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    	at sun.nio.cs.StreamDecoder.read(Unknown Source)
    	at java.io.InputStreamReader.read(Unknown Source)
    	at java.io.BufferedReader.fill(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at java.io.BufferedReader.readLine(Unknown Source)
    	at server.server$serverparallelo.run(server.java:49)
    	at java.lang.Thread.run(Unknown Source
    a quanto pare non riconosce i flussi di input-output verso il client...ma perchè?
    mi scuso per la prolissità e ringrazio in anticipo coloro che mi daranno una mano.
    lellone

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    cosa c'è qui?

    server.server$serverparallelo.run(server.java:49)

    cosa fai a questa riga insomma

    Da quello che vedo io (spero sia corretto) è questa
    codice:
    dalclient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    e il tipo di errore mi dice che per qualche motivo la connessione è stata chiusa prima di passare i messaggi.
    Lato client fin dove arrivi?
    RTFM Read That F*** Manual!!!

  3. #3
    guarda, se ho ben capito quello che mi vuoi dire, lato client la socket viene inizializzata correttamente, ma quando si tratta di comunicare con il server attraverso i flussi, l'esecuzione si interrompe e mi spara questo messaggio di errore....

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quello è il messaggio del server, non del client.
    Server e client vanno eseguiti da due shell differenti, quindi hanno 2 stacktrace differenti. Tu hai messo solo quello del server, a me interessa anche quello del client. Ti ripeto, probabilmente si interrompe brutalmente al connessione
    RTFM Read That F*** Manual!!!

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Da notare che per la parte client, tu crei un oggetto di tipo "client", ma non ne richiami mai il metodo "funzionamento()". Di conseguenza, dopo aver creato l'istanza del client, semplicemente finisce l'esecuzione. Questo spiega perchè, nel server, ti viene sollevata quell'eccezione: perchè la connessioen viene chiusa in quanto il programma termina.

    PS: impara fin da subito ad utilizzare le convenzioni Java per la nomenclatura. I nomi delle classi devono iniziare con una lettera maiuscola.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da LeleFT
    Da notare che per la parte client, tu crei un oggetto di tipo "client", ma non ne richiami mai il metodo "funzionamento()". Di conseguenza, dopo aver creato l'istanza del client, semplicemente finisce l'esecuzione. Questo spiega perchè, nel server, ti viene sollevata quell'eccezione: perchè la connessioen viene chiusa in quanto il programma termina.

    PS: impara fin da subito ad utilizzare le convenzioni Java per la nomenclatura. I nomi delle classi devono iniziare con una lettera maiuscola.


    Ciao.
    spetta però, i buffer li prende nel costruttore (che esegue), non invia il mex (come hai fatto notare)
    RTFM Read That F*** Manual!!!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da valia
    spetta però, i buffer li prende nel costruttore (che esegue), non invia il mex (come hai fatto notare)
    Sì, la Socket viene creata (e quindi, aperta) nel costruttore.
    Sempre nel costruttore crea il BufferedReader ed il PrintStream per le comunicazioni... poi l'applicazione termina, chiudendo quindi la Socket.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    ragazzi, finalmente ci sono riuscito.
    era semplicemente un errore dovuto al fatto che avevo specificato per la socket client un numero di porto differente rispetto a quello server.
    per il resto funziona...
    grazie a tutti per l'interesse.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da lellone88
    ragazzi, finalmente ci sono riuscito.
    era semplicemente un errore dovuto al fatto che avevo specificato per la socket client un numero di porto differente rispetto a quello server.
    per il resto funziona...
    grazie a tutti per l'interesse.
    ???
    Il codice che hai postato non ha questo problema... e con il codice che hai postato non funziona proprio nulla.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da lellone88
    ragazzi, finalmente ci sono riuscito.
    era semplicemente un errore dovuto al fatto che avevo specificato per la socket client un numero di porto differente rispetto a quello server.
    per il resto funziona...
    grazie a tutti per l'interesse.
    ma io avevo visto lo stesso numero nel codice sopra

    sicuro che hai postato il codice che eseguivi?
    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.