Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139

    Comunicazione Client/Server Java.

    Ciao a tutti,

    ho realizzato un software java per la comunicazione client server, volevo chiedere se esiste un modo per "forzare" l'invio di due messaggi dal server al client.

    Ecco il codice Server e mi spiego meglio:
    codice:
            out.println("Chiave pubblica: ("+n+","+e+")");
            out.flush();
            out.println("Username:");
            out.flush();
            String username=in.nextLine();
            out.println("Password");
            out.flush();
            String psw=in.nextLine();
    in questo modo tra il mio output "Chiave pubblica......" e l'output "Username" ho il problema di dover premere invio ed avere una riga vuota tra gli output.
    Mentre vorrei che venissero inviati prima uno poi l'altro senza dover dare invio dal client.

    Se può servire il codice del client è il seguente:
    codice:
    package client1;
    import java.io.*;
    import java.net.*;
    import java.util.Scanner;
    import java.util.NoSuchElementException;
    
    
    public class Client1 
    {
        public Client1(String IP, int port)
        {
            this.IP=IP;
            this.port=port;
        }
        
        public void startClient() throws IOException
        {
            Socket sock=new Socket(IP,port);
            System.out.println("Connessione stabilita");
            
            Scanner sockIN=new Scanner(sock.getInputStream());
            PrintWriter sockOUT=new PrintWriter(sock.getOutputStream());
            Scanner stdin=new Scanner(System.in);
            
            String a=sockIN.nextLine();
            System.out.println(a);
            try{
                while(true)
                {
                    String input=stdin.nextLine();
                    sockOUT.println(input);
                    sockOUT.flush();
                    String sockline=sockIN.nextLine();
                    System.out.println(sockline);
                }
            }catch(NoSuchElementException e)
            {
                System.out.println("Connessione chiusa");
            }finally
            {
                stdin.close();
                sockIN.close();
                sockOUT.close();
                sock.close();
            }
        }
        
        private String IP;
        private int port;
    }
    Grazie per l'aiuto!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da EziT90 Visualizza il messaggio
    in questo modo tra il mio output "Chiave pubblica......" e l'output "Username" ho il problema di dover premere invio ed avere una riga vuota tra gli output.
    Mentre vorrei che venissero inviati prima uno poi l'altro senza dover dare invio dal client.
    La questione è il "protocollo" di comunicazione ad alto livello che hai scelto per scambiare dati tra client e server.
    Spiego meglio: il tuo protocollo innanzitutto è testuale, fatto "a righe". Su questo non ci sono problemi.
    Il client però è totalmente ignaro di cosa viene scambiato, perché tutto è "pilotato" da cosa il server invia al client ed è l'utente "umano" che interpreta e capisce cosa chiede il server e quindi risponde a tono inviando una riga al server.

    Con un protocollo del genere non puoi fare molto ... perché tutto è pilotato dal server. Ragionaci su un attimo:

    1) Il Server invia una riga al Client
    2) Il Client riceve la riga e la stampa a video
    3) L'utente legge la riga stampata a video, capisce la richiesta e scrive lui una riga che viene inviata al Server
    4) Il Server "sa" che cosa rappresenta una riga ricevuta (lo sa perché è LUI, il Server, che pilota la comunicazione), facendo es. String username=in.nextLine(); quindi QUI sa che si aspetta uno username

    La logica si ripete dal punto 1)

    Ma in tutto questo il Client NON sa che cosa succede. E quindi come potrebbe "sapere" di dover ricevere 2 righe invece che una o di dover inviare es. 2 righe in un colpo solo invece che una?

    Devi cambiare qualcosa a livello del "protocollo" .....
    Ultima modifica di andbin; 29-12-2016 a 14:13
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Quote Originariamente inviata da andbin Visualizza il messaggio
    La questione è il "protocollo" di comunicazione ad alto livello che hai scelto per scambiare dati tra client e server.
    Spiego meglio: il tuo protocollo innanzitutto è testuale, fatto "a righe". Su questo non ci sono problemi.
    Il client però è totalmente ignaro di cosa viene scambiato, perché tutto è "pilotato" da cosa il server invia al client ed è l'utente "umano" che interpreta e capisce cosa chiede il server e quindi risponde a tono inviando una riga al server.

    Con un protocollo del genere non puoi fare molto ... perché tutto è pilotato dal server. Ragionaci su un attimo:

    1) Il Server invia una riga al Client
    2) Il Client riceve la riga e la stampa a video
    3) L'utente legge la riga stampata a video, capisce la richiesta e scrive lui una riga che viene inviata al Server
    4) Il Server "sa" che cosa rappresenta una riga ricevuta (lo sa perché è LUI, il Server, che pilota la comunicazione), facendo es. String username=in.nextLine(); quindi QUI sa che si aspetta uno username

    La logica si ripete dal punto 1)

    Ma in tutto questo il Client NON sa che cosa succede. E quindi come potrebbe "sapere" di dover ricevere 2 righe invece che una o di dover inviare es. 2 righe in un colpo solo invece che una?

    Devi cambiare qualcosa a livello del "protocollo" .....
    Cosa intendi con fare un cambio a livello di protocollo..??
    Io avevo pensato di modificare il mio client, ma avrei bisogno dell'invio simultaneo solo in un punto, mentre per il resto la comunicazione mi funziona come deve e come volevo funzionasse.

    Grazie per l'aiuto!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da EziT90 Visualizza il messaggio
    Cosa intendi con fare un cambio a livello di protocollo..??
    Se vuoi che il Server debba poter inviare 2 righe insieme al Client (o se vogliamo generalizzare .. N), la cosa è molto semplice: basta anticipare al Client quante righe deve aspettarsi.

    E si può fare banalmente inviando al Client una prima riga con un numero (es. "2") e poi le due righe. Il Client ovviamente deve essere allineato a questo concetto e quindi: a) leggere la riga con il numero (e parsarlo in int), b) ciclare per leggere N righe e stamparle, c) fare il resto come stavi facendo.

    Il Client in questo modo resta ancora "ignaro" di quale è il senso della comunicazione (ripeto, lo SA il Server il senso di ciò che invia e riceve e lo SA l'utente "umano" che legge e scrive). Ma almeno il Client ha una informazione in più: quante righe deve aspettarsi dal Server.

    E per concludere: questo è il concetto del "protocollo". Con questa modifica il protocollo è leggermente diverso da quello che stavi usando adesso.
    Ultima modifica di andbin; 29-12-2016 a 19:21
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se vuoi che il Server debba poter inviare 2 righe insieme al Client (o se vogliamo generalizzare .. N), la cosa è molto semplice: basta anticipare al Client quante righe deve aspettarsi.

    E si può fare banalmente inviando al Client una prima riga con un numero (es. "2") e poi le due righe. Il Client ovviamente deve essere allineato a questo concetto e quindi: a) leggere la riga con il numero (e parsarlo in int), b) ciclare per leggere N righe e stamparle, c) fare il resto come stavi facendo.

    Il Client in questo modo resta ancora "ignaro" di quale è il senso della comunicazione (ripeto, lo SA il Server il senso di ciò che invia e riceve e lo SA l'utente "umano" che legge e scrive). Ma almeno il Client ha una informazione in più: quante righe deve aspettarsi dal Server.

    E per concludere: questo è il concetto del "protocollo". Con questa modifica il protocollo è leggermente diverso da quello che stavi usando adesso.

    Ciao Andbin, grazie per la risposta :-), mi hai chiarito il concetto, ero finito fuori strada dato che pensavo ci fossero dei metodi particolari messi a disposizione da java per fare ciò che avevo in mente, mentre la soluzione era "più semplice", mediante l'uso del contatore.

    Adesso farò la modifica e testerò il risultato. ;-)

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.