Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    378

    [java Socket Multi Thread]

    Ciao, sto cercando di farr comunicare più client con un solo server.
    I client inviano stringhe di testo al server che le riceve e controlla se hanno una particolare sintassi. Se la sintassi è di un certo tipo fa un azione e restituisce un messaggio di conferma.
    La cosa sembra funzionare ma dopo aver inserito una stringa giusta (ad esempio ##A##) e aver ricevuto la conferma ( OK A), tutte le volte successive che inserisco una stringa esatta mi da prima errore e poi inserendo una qualsiasi altra stringa (giusta o sbagliata) mi da la conferma a quella di prima.....

    Metto il codice semplificato qui sotto, spero che qualcuno possa darmi una mano. Grazie in anticipo.

    -- SERVER -----------------------------------------------------------------------------

    public class TCPParallelServer {
    public void start() throws Exception {
    ServerSocket serverSocket = new ServerSocket(7777);

    //Ciclo infinito di ascolto dei Client
    while(true) {
    System.out.println("In attesa di chiamate dai Client... ");
    Socket socket = serverSocket.accept();
    System.out.println("Ho ricevuto una chiamata di apertura da: [" + socket.getInetAddress() + "]");
    ServerThread serverThread = new ServerThread(socket);
    serverThread.start();
    }
    }

    class ServerThread extends Thread {

    private Socket socket;
    static ArrayList anagraficaBloccata = new ArrayList();
    static ArrayList magazzinoBloccato = new ArrayList();

    public ServerThread (Socket socket) {
    this.socket = socket;
    }

    //esecuzione del Thread sul Socket
    public void run() {
    try {
    DataInputStream is = new DataInputStream(socket.getInputStream());
    DataOutputStream os = new DataOutputStream(socket.getOutputStream());
    BufferedWriter stOut = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
    while(true) {
    String userInput = "";
    userInput = is.readLine();

    if (userInput == null || userInput.equals("##QUIT##"))
    break;

    else{
    // controllo la stringa che ricevo

    if(userInput.startsWith("##A##")){
    stOut.write("OK A \r\n");
    stOut.flush();
    }

    if(userInput.startsWith("##M##")){
    stOut.write("OK M \r\n");
    stOut.flush();
    }

    // comando non riconosicuto
    else{
    //os.writeBytes("");
    stOut.write("ERRORE FORMATO STRINGA \r\n");
    stOut.flush();
    }

    userInput = "";
    os.flush();
    }
    }
    os.close();
    is.close();
    System.out.println("Ho ricevuto una chiamata di chiusura da: " + socket + "\r\n");
    socket.close();
    }
    catch (IOException e) {
    System.out.println("IOException: " + e);
    }
    }


    -- CLIENT ----------------------------------------------------------------------------


    public class TCPClient {
    public void start()throws IOException {
    //Connessione della Socket con il Server
    Socket socket = new Socket("127.0.0.1", 7777);

    //Stream di byte da passare al Socket
    DataOutputStream os = new DataOutputStream(socket.getOutputStream());
    DataInputStream is = new DataInputStream(socket.getInputStream());
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Per disconnettersi dal Server scrivere: QUIT\n");


    //Ciclo infinito per inserimento testo del Client
    while (true) {
    System.out.print("Inserisci: ");
    String userInput = stdIn.readLine();
    if (userInput.equals("QUIT"))
    break;
    os.writeBytes(userInput + '\n');
    //System.out.println(is.readLine());
    String risposta = is.readLine();
    System.out.println("Messaggio di risposta: " + risposta);
    }

    //Chiusura dello Stream e del Socket
    os.close();
    is.close();
    socket.close();
    }
    public static void main (String[] args) throws Exception {
    TCPClient tcpClient = new TCPClient();
    tcpClient.start();
    }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    378
    nessuna idea ?? io nn riesco a trovare nessuna soluzione ..... :-(

  3. #3
    Secondo me dovresti implementare (come faccio io) una funzione che cerchi tra i caratteri arrivati quelli che identificano l'inizio stringa e quelli che ne dichiarano la conclusione. Dopo puoi controllarne il contenuto.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    378
    scusa potresti spiegarti meglio ?? intendi creare un metodo privato che viene richiamato appena ricevo la stringa dal socket e controlla se il tipo di stringa è un comando e in quel caso lo elabora oppure lo scarta subito dando messaggio di errore ???

    grazie ciao

  5. #5
    Mi rispiego. Nel mio caso una strigna inizia con il byte 0xf7 e termina con 0xfd (chiaramente puoi mettere ciò che preferisci). Il penultimo byte della strinfa è la somma XOR di tutta la stringa.
    Quando hai trovato il primo byte e l'ultimo, applichi la funzione XOR che controlla che la stringa sia valida e poi la interpreti come le tue esigenze richiedono.

    Ciao ciao.

  6. #6
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Ciao Il problema sta in questo pezzo di codice:

    Codice PHP:
              if (userInput.startsWith("##A##")) {
                  
    stOut.write("OK A \r\n");
                  
    stOut.flush();
                }
                if (
    userInput.startsWith("##M##")) {
                  
    stOut.write("OK M \r\n");
                  
    stOut.flush();
                }else{
                  
    stOut.write("ERRORE FORMATO STRINGA \r\n");
                  
    stOut.flush();
                } 
    Infatti in questo caso se non entra nel primo if oppure esso va sempre nell'else e ti da errore; ho corretto il tuo codice con questo:

    Codice PHP:
                if (userInput.startsWith("##A##")) {
                  
    stOut.write("OK A \r\n");
                  
    stOut.flush();
                }else if (
    userInput.startsWith("##M##")) {
                  
    stOut.write("OK M \r\n");
                  
    stOut.flush();
                }else{
                  
    stOut.write("ERRORE FORMATO STRINGA \r\n");
                  
    stOut.flush();
                } 
    Ora dovrebbe andare. PS Ho notato che utilizzi il DataInputStream che potrebbe causra problemi visto che il metodo readLine non traduce bene le stringhe...ti consiglio di utilizzare
    BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    Ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    378
    Grazie denis76 e Angelo1974 ho fatto un mix delle due cose e ora funziona alla perfezione !!

    Ormai che ci sono posso sfruttarvi per chiedervi un'altra cosa ?? se al posto di inviare stringhe volessi inviare oggetti è possibile ?? avete per caso un esempio semplice e comprensibile !?!?


    grazie ciao

  8. #8
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Ciao.
    Esempi di questo tipo non ne ho...però puoi anche inviare degli oggetti solo che questi devono essere serializzabili (devono, cioè, implementare l'interfaccia
    Codice PHP:
    java.io.Serializable 
    ); inoltre penso che tutto il processo dovrebbe avvenire tramite RMI e non semplicemente come hai fatto in questo caso.
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    378
    grazie, vedrò cosa trovo su internet per serializzare gli oggetti !!!! grazie a tutti per la collaborazione !!!

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.