Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    27

    [JAVA] trasferimento oggetti tramite socket tcp

    Ho un server multithread che accetta connessioni di client su un socket ServerSocket e le assegna a socket Socket.
    Una volta accettata una nuova connessione, viene avviato un nuovo thread per gestirla del tipo :

    queryHandler queryHand = new queryHandler(clientSock);

    La classe queryHandler funziona su un altro thread (estende Thread e si avvia nel costruttore) deve mettersi in attesa di oggetti inviati dal client, riceverli, elaborarli e reinviarli.

    Per fare questo, dopo aver costruito l oggetto, viene usato un metodo run() del tipo:

    ...
    ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
    ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
    queryAsk ask = (queryAsk)ois.readObject();
    ...
    queryReply reply = new queryReply();
    oos.writeObject(reply);
    ...

    il problema che ho rilevato inserendo la stampa di alcuni messaggi di controllo sta nel fatto che nel momento dell acquisizione delle streams il thread si blocca e non va piu avanti (avevo provato anche a farle prendere nel costruttore ma cosi facendo non si avviava nemmeno il main, si bloccava prima di this.start())

    qualcuno mi illumina?

    grazie : )

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    aggiungi tre righe al tuo metodo run:
    codice:
    oos.flush();
    oos.close();
    return;
    la prima serve ad assicurarsi che eventuali buffer vengano effettivamente svuotati (l'oggetto serializzato viene trasferito per intero), la seconda chiude il canale di trasferimento, la terza esce dal run
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    27
    il problema è che non va oltre queste due righe

    ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
    ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());

    se le metto nel costruttore non avvia nemmeno il run (che è avviato alla fine del costruttore)
    se le metto nel run si blocca e non va piu avanti

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    EDIT: posta tutto il codice.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    27
    import java.net.*;
    import java.util.*;
    import java.util.concurrent.*;
    import java.io.*;
    import java.lang.*;

    public class queryHandler extends Thread {

    private Socket client;

    public queryHandler() {}

    public queryHandler(Socket clientSocket){

    client = clientSocket;

    this.start();
    }

    public void run() {
    while(true){
    try {

    ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
    ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());

    queryAsk ask = (queryAsk)ois.readObject();

    queryReply reply = new queryReply();
    if(ask.getType() == 0) makeReply0(reply);
    if(ask.getType() == 1) makeReply1(reply);

    oos.writeObject(reply);

    //qua cè da aggiungere flush e close

    } catch(Exception e) {System.out.println("exce");}

    }
    }

    Avvio il thread relativo ad ogni socket nel thread del server con un comando del tipo :

    queryHandler queryHand = new queryHandler(clientSock);

    dove clientSock è il risultato di una accept sul ServerSocket del server


    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    quindi in altre parole si impianta al read. Sicuro che ci sia qualcosa da leggere?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    27
    no, si impianta quando prende le streams, in pratica non supera quelle 2 istruzioni!

    da leggere non cè niente finche il client non manda qualcosa, se si bloccasse alla read sarebbe tutto normale

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.