Visualizzazione dei risultati da 1 a 8 su 8

Discussione: socket client-server

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123

    socket client-server

    Ho fatto il codice di prova di comunicazione fra client e server e sembra che vada tutto ok, ora se volessi fare che il client una volta collegato legge un numero e glielo invia, il server lo riceve ed esegue per esempio il fattoriale (prima cosa che mi è venuta in mente), e lo invia ancora al client che lo stampa....come dovrei comportarmi???
    (se qualcuno magari conosce una guida sulle socket in java on line e magari in italiano sarebbe una buona cosa)

    codice:
    public class Server {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(3456);
            System.out.println("In attesa");
            Socket clientSocket = serverSocket.accept();
            System.out.println("Si è connesso un client");
            //una volta connesso client dobbiamo creare printstream per la scrittura
            PrintWriter pw   = new PrintWriter(clientSocket.getOutputStream(),true);
            BufferedReader br   = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));
            String messaggio = br.readLine();
            System.out.println(messaggio);
            pw.println("Ho ricevuto il tuo messaggio");
            pw.close();
            br.close();
            clientSocket.close();
            serverSocket.close();
        }
    codice:
    public class Client {
       public static void main(String[] args)
       {
            try
            {
                Socket socket = new Socket("localhost", 3456);
                PrintWriter pw   = new PrintWriter(socket.getOutputStream(),true);
                BufferedReader br   = new BufferedReader( new InputStreamReader(socket.getInputStream()));
                System.out.println("Connessione al server");
                pw.println("Ciao sono il client");
                String messaggio = br.readLine();
                System.out.println(messaggio);
                br.close();
                pw.close();
                socket.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
       }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    la logica mica cambia, qualsiasi tipo di operazione devi fare:
    Lato client
    1. collegati al server
    2. invio numero
    3. ricevi numero e stampa

    ad ogni passo corrisponde un metodo (che ha vita propria indipendentemente dagli altri).

    1. collegamento al server, torna un booleano che dice se ci siamo collegati o no. Puoi anche non avere valore di ritorno (in questo caso il controllo lo fai se hai valorizzato il socket o meno)
    2. invio numero, allo stesso e identico modo con cui al server hai inviato la stringa (in generale puoi inviare qualsiasi oggetto serializzabile).
    anche questo è un metodo a se stante, se socket valido, prelevi dallo stesso i buffer e schianti dentro un numero (che è quello di cui vuoi il conto.
    3. ricezione numero (che puoi anche mettere nel metodo sopra, non cambia) e lo ricevi come hai ricevuto la stringa (stando ovviamente attento ai tipi che tratti).

    Lato server (un thread):

    1. costruttore, istanzia il server
    2. thread, non fa altro che fare un ciclo while infinito mettendosi in attesa della connessione. (Ciclo che interrompi brutalmente buttando giù il server oppure prevedendo una richiesta particolare che è una exit)
    3. connessione attiva, riceve numero, esegue calcolo, invia numero. Nota che in generale potrei dire riceve richiesta, esegue richiesta, invia richiesta e bene o male lo hai fatto.

    Ti consiglio di sincronizzare le operazioni sul server (per essere sicuro che 2 client che chiedono contemporaneamente il calcolo non ricevano il result errato)
    Se metti client/server example java su google hai una marea di esempi.

    Per quanto riguarda la lingua, la documentazione ufficiale è in inglese, so che può essere ostico all'inizio, ma bisogna abituarsi perché se si vuole programmare le migliori risorse sono in inglese (oltre al fatto che la oracle fornisce documentazione in inglese).

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123
    Grazie valia,
    sei sempre te che mi aiuti...
    proverò ad ascoltare i tuoi consigli, anche se al livello in cui sono ora e non avendo ancora visto con il mio prof i thread la vedo molto molto dura ...
    però "nothing is impossible"

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e ma ti assicuro che implementarlo in java è più semplice di quanto pensi, ovviamente dal punto di vista teorico ci sono degli accorgimenti da usare (e questo lo fai trattando la gestione delle risorse).

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123
    Scusami valia,
    stò provando a risolverlo ma non riesco
    avevo pensato di mettere il numero tramite scanner nella classe Server dopo la linea "Ho ricevuto il messaggio"...ma ho visto che non va...
    quindi questa idea è completamente sbagliata vero?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    posta il codice (altrimenti vado a tentativi)
    In generale, tu ricevi n valori nello stesso ordine con cui li invii: per cui se da client fai l'invio uno dopo l'altro di

    ciao
    inviato
    messaggio
    10
    (fatto con pw.println(valore))
    dal server avrai nell'ordine

    ciao
    inviato
    messaggio
    10
    (ottenuto con valore = br.readLine() all'interno di un ciclo)
    per cui hai un invio sequenziale di linee (apposta sono andata a capo), quindi una lettura di linee ti dà le info.

    per cui lo stesso buffer ti consente di leggere i due valori differenti, sapendo che il primo è il tuo mex, il secondo il numero

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123
    alla classe server che ho postato nel mio primo post, ho aggiunto le seguenti righe...
    la prima linea funziona ma poi il resto non va...volevo fare in modo che client legga numero e poi lo invii a server...
    per inserire da tastiera ed inviare numero pensavo fosse così
    codice:
    pw.println("Ho ricevuto il tuo messaggio");
    Scanner sc = new Scanner(System.in);
    int numero = sc.nextInt();
    pw.println(numero);

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Scusa rifletti un po': il principio è fare in modo che al server giunga un numero. In generale il server sta che so a Milano e tu sei a Roma, ergo come potresti mai chiedere il tuo servizio (da Roma) su un server a Milano usando il tuo algoritmo?

    Visto che così non è possibile, è il client (applicazione client che solo nel tuo caso sta sulla tua stessa macchina) a inviarti il numero attraverso il socket.
    Se quel codice vuoi metterlo devi metterlo nel client, non nel server.

    All'inizio prova a fare il calcolo inviando dati cablati: introduci una fonte di errore alla volta, in questo caso fai funzionare comunicazione e algoritmo e poi relativizza il punto da cui prelevi il dato

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.