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

    [JAVA] Socket: problemi per piu' richieste su stessa socket

    Salve,
    sto usando le socket per far comunicare due processi che scambiano informazioni, ovvero stringhe, numeri interi o file. Ho creato dei metodi che spediscono questi tipi di dati e tutto funziona alla prima richiesta. Cioe' se ho 3 richieste successive dal client al server, rispettivamente di un file un intero e una stringa, solo la prima richiesta mi viene soddisfatta correttamente. E se cambio l'ordine non cambia il risultato, ovvero solo la prima richiesta mi viene letta bene. Dopo la socket legge tutti valori strani.
    Io uso un InputStreamReaderer e un InputStreamWriter sia nel server che nel client.

    Da cosa potrebbe dipendere? Avete mai incontrato questo tipo di problema?

    Grazie a tutti!

    Luca.
    Prima di dire che sei un Webmaster, guarda in giro per la rete....

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Senza codice non è facile da stabilire. Fai il flush dei dati?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Ciao,
    sono d'accordissimo con il ragazzo che ha risp prima di me per il fatto che senza codice nn è facile risponderti..
    cmq io sto facendo un programma client/server in cui si trasmettono file e stringhe..
    ti consiglio di utilizzare i metodi writeObject e readObject per leggere e scrivere stringhe tra i due processi e un OutputStream/InputStream per scrivere e leggere i file byte per byte... xò dipende da come vuoi strutturare il tuo protocollo di rete...
    Inoltre credo che per una socket Java i processi vengano accodati automaticamente quindi se tu chiedi ad un processo di leggere una stringa e un file dall'altro processo nello stesso tempo, le due istruzioni vengono messe in coda e una volta terminata una viene eseguita l'altra...
    Fammi cmq sapere se ci sei saltato fuori xkè mi interessa molto questo argomento...
    Ciao da bomberjava!

  4. #4
    Allora ho due classi che effettuano tutte le operazioni sulle socket, una per il client e una per il server. Ecco il codice di uno (sono molto simili le due classi):

    // Implementa il livello di comunicazione CLIENT

    import java.net.*;
    import java.io.*;
    public class SocketUtilClient {
    final static int MSG_TEXT = 1;
    final static int FILE_SEND = 2;
    final static int FILE_RECEIVE = 3;
    final static int EXIT = 4;
    final static int NULL = 5;
    Socket clientSock;
    final int PORT = 6794;
    final String HOST = "localhost";
    DataOutputStream outToOther;
    DataInputStream inFromOther;

    public Socket openConnection() {
    try {
    clientSock = new Socket(HOST, PORT);
    } catch (UnknownHostException e) {
    return null;
    } catch (IOException e) {
    return null;
    }
    try {
    outToOther = new DataOutputStream(clientSock.getOutputStream());
    } catch (IOException e) {
    }
    try {
    inFromOther = new DataInputStream(clientSock.getInputStream());
    } catch (IOException e) {
    }
    return clientSock;
    }
    public void closeConnecion() {
    try {
    clientSock.close();
    } catch (IOException e) {
    }
    }

    public int sendFile (String fileName) throws IOException {
    int res = 0;
    File file = new File(fileName);
    int numOfBytes = (int) file.length();
    FileInputStream inFile = null;
    try {
    inFile = new FileInputStream(fileName);
    } catch (FileNotFoundException e) {
    res = 0;
    }
    byte[] fileInBytes = new byte[numOfBytes];
    inFile.read(fileInBytes);
    outToOther.write(fileInBytes, 0, numOfBytes);
    outToOther.flush();
    return res;
    }

    public int sendString(String text) {
    int res = 1;
    try {
    //outToOther.writeChars(text + "\n\r");
    outToOther.writeBytes(text + "\n\r");
    outToOther.flush();
    System.out.println("Chars scritti: " + text);
    } catch (IOException e) {
    res = 0;
    }
    return res;
    }

    public String readString() {
    String textRead = null;
    try {
    textRead = (inFromOther.readLine()).toString();
    } catch (IOException e) {
    }
    return textRead;
    }

    public int readInt() {
    try {
    int q = (int)inFromOther.readInt();
    closeStreams();
    return q;
    }
    catch (IOException e3) {
    return 0;
    }
    }

    public void sendInt(int num) {
    try {
    outToOther.writeInt((int)num);
    outToOther.flush();
    } catch (IOException e) {
    }
    }

    public int readService() {
    return readInt();
    }

    public void requestService(int services) {
    sendInt(services);
    }
    }


    Poi il client esegue questo:

    SocketUtilClient socket = null;
    int tmp = 0;
    socket = new SocketUtilClient();
    sock = socket.openConnection();
    System.out.println("Connessione aperta");
    if (sock == null) {
    System.out.println("Errore nella socket!");
    System.exit(0);
    }

    // Richiesta del servizio:
    socket.requestService(socket.FILE_SEND);
    try {
    tmp = socket.sendFile("c:\\bootfont.bin");
    } catch (IOException e) {
    }
    if (tmp == 0)
    System.out.println("Errore nel file");

    socket.requestService(socket.MSG_TEXT);
    int w;
    w = socket.sendString("Ciao gente secondo messaggio scambiato");
    if (w == 0)
    System.out.println("Errore nello spedire il msg");




    e cosi' via.

    La prima richiesta viene eseguita correttamente, tutte le successive no! Richiedo la prima funzione con requestService e poi chiamo il metodo appropriato (esempio sendFile) e funziona. ma poi gia' quando invio la seconda requestService il server legge tutto male.

    Ah, ecco il codice del server :

    while(service != 4){
    service = (int)sockS.readService();

    System.out.println("SERVER: servizio letto: " + service);

    switch(service) {
    case 1: // Stringa di testo
    String str = sockS.readString();
    System.out.println("Stringa letta sul server: " + str);
    //sockS.requestService(sockS.NULL);
    break;
    case 2: // File send from client
    File f = sockS.receiveFile("c:\\received.txt");
    //sockS.requestService(sockS.NULL);
    break;
    case 3: // File receive
    break;
    case 4: // Fine
    break;
    case 5: // NULL
    break;
    }

    //System.out.println("Numero letto: " + sockS.readInt());
    }



    Credo di aver detto tutto sul codice.... che ne pensate?!

    Ciao Luca!
    Prima di dire che sei un Webmaster, guarda in giro per la rete....

  5. #5
    Diciamo la domanda piu' correttamente diventa questa: si posso fare piu' letture e scritture sugli stream di input e output sulla stessa socket dopo averla aperta? O vanno aperte sempre nuove socket per ogni operazione sulla socket stessa? Non mi sembra ottimale come soluzione, ma al momento dal comportamento delle socket mi sembra una scelta obbligata..

    Ciao Luca!
    Prima di dire che sei un Webmaster, guarda in giro per la rete....

  6. #6

    [Java] Socket piu' richieste sulle stessa connessione

    Salve,
    vorrei sapere se è possibile fare più operazione sugli stessi stream associati ad una socket aprendo una sola volta la connessione, e se ci sono dei modi per ottimizzare questo compito.

    Mi speigo meglio.

    Creo una socket e associo gli stream di I/O:

    Socket s = new Socket("localhost", 1234);
    DataOutputStream outToOther = new DataOutputStream(s.getOutputStream());
    DataInputStream inFromOther = new DataInputStream(s.getInputStream());

    posso fare nel codice:

    outToOther.write(..);
    inFromOther.read(..);
    outToOther.write(..);
    outToOther.write(..); ?

    Pechè facendo così nel mio codice solo la prima richiesta viene letta bene. Tutte le successive vengono letti valori sballati a caso.

    Ah, gli stream vanno associati alla creazione della socket una volta per tutte o vanno ricreati o aperti/chiusi ogni volta che servono?

    Grazie a tutti!

    Luca.
    Prima di dire che sei un Webmaster, guarda in giro per la rete....

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Non si tratta della stessa domanda che hai posto qui? :master:
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Beh la domanda in questa forma l'avevo posta solo nell'ultimo messaggio di quel thread, quando credo nessuno lo leggeva più.. infatti dalle risposte avevo visto che c'erano degli interessati all'argomento ma poi non hanno fatto sapere più niente.. Quindi ho creduto meglio aprire un nuovo thread con la domanda precisa, dato che nell'altro ero stato molto più generico.. se ho sbagliato chiedo scusa...
    Prima di dire che sei un Webmaster, guarda in giro per la rete....

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da Luca450Mhz
    Beh la domanda in questa forma l'avevo posta solo nell'ultimo messaggio di quel thread, quando credo nessuno lo leggeva più.. infatti dalle risposte avevo visto che c'erano degli interessati all'argomento ma poi non hanno fatto sapere più niente.. Quindi ho creduto meglio aprire un nuovo thread con la domanda precisa, dato che nell'altro ero stato molto più generico.. se ho sbagliato chiedo scusa...
    Non è corretto aprire nuove discussioni per lo stesso problema.

    Ho unito le discussioni con le ulteriori precisazioni fatte.

    In generale, è sufficiente inserire un intervento nella discussione che eventualmente è "caduta un po' in basso" per riportarla in alto, magari approfittandone per aggiungere dettagli alla richiesta incentivando quindi una risposta.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.