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

    [JAVA] socket (HELP)

    Salve a tutti.
    E' un pò di tempo che sto lavorando con il pacchetto java.net.
    Sto creando un'applicazione server-client.

    Il mio server è in ascolto perenne in attesa che client ci si connettano.
    Una volta che il client richiede una connessione si avvia una classe thread che lo gestisce.

    Il tutto è gestito tramite una form
    Tasto listen -> ciclo infinito di attesa su richiesta di connessione, e avvia di un thread a richiesta di connessione.
    Tasto ricevi -> riceve dati dai client e visualizzarli nel jtextbox assocciato
    Tasto invia -> invia dati ai client




    Il mio problema è il seguente
    Una volta ricevuto dati dal client, non riesco a visualizzarli sulla textbox.Questo perchè la classe Jframe si trova in attesa di altri client, ma ovviamente riesco a visualizzarli sulla shell, (questo per dire che comunque i dati vengono ricevuti) (non esiste una listen, non blocking come in c )

    P.S.
    I tasti ricevi e invia non sono ancora implementati.
    I dati vengono ricevuti nel thread.

  2. #2
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Prova a postare un po' di codice...
    Linux user number 403381

    Stop TCPA!

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    La soluzione al tuo problema consiste nel costruire una classe separata per il Server e lasciare la finestra come applicazione indipendente. Il server, a questo punto, sara' un Thread che gira all-interno della finestra. In questo modo la finestra non viene bloccata dal Server. A grandi linee la struttura e' simile a questa:
    codice:
    public class Finestra extends JFrame {
       private Server server;
       ...
       public Finestra() {\
          ...  // inizializzazioni varie
          server = new Server(this);  // gli passo un puntatore alla finestra per le comunicazioni
       }
    
       // metodo chiamato dal pulsante per l'ascolto dei client
       private void avviaIlServer() {
          server.start();
       }
    
       public void scriviSullaTextArea(String testo) {
          textArea.setText(testo);
       }
    }
    
    public class Server extends Thread {
       private Finestra f;
       public Server(Finestra f) {
          this.f = f;
       }
       ...
       private void ricevutoMessaggio(Messaggio msg) {
          String testo = msg.getTexto();  // prendo il testo del messaggio o simili
          f.scriviSullaTextArea(testo);
       }
    }
    Se il server e' in un oggetto Thread separato (una classe a se stante) la finestra non si blocca, mentre il server e' in attesa di connessioni e/o messaggi. Il thread, dal canto suo, comunica con la finestra attraverso il puntatore e puo' spedire i messaggi da visualizzare in modo indipendente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Ciao Ragazzi, non ci posso credere !!!!
    Ce l'ho fatta!

    Ho creato un Server che si mette in ascolto indefinito di client e riceve da essi in qualsiasi momento!


    Grazie mille per i vostri aiuti.

    Se volete vi post il codice.


    P.S.
    Vi vorrei porre un'altro problema...
    Il seguente:
    Con il mio codice riesco ad inviare e ricevere dati dai client, ma solo sotto forma di stringa.
    Vorrei se possibile inviare e ricevere una struct... tutti mi hanno detto che devo serializzare e deserializzare.Ma con rispetto parlando non so nemmeno cosa significhi.

    Qualcuno per caso ha già provato a fare questa cosa.Mi potreste indirizzare.Grazie Mille

  5. #5
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Serializzare significa scomporre l'oggetto (che è una struttura complessa) in un flusso di byte, inviarlo lungo un canale di I/O per ricomporlo poi dall'altra parte.

    Per una spiegazione dettagliata ti rimando a questo link, tratto da Thinking in Java di Bruce Eckel
    Linux user number 403381

    Stop TCPA!

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    In sostanza, si tratta semplicemente di scrivere una classe che rappresenta la tua struttura da inviare/ricevere e far implementare l'interfaccia Serializable alla classe:
    codice:
    import java.io.Serializable;
    
    public class MiaStruttura implements Serializable {
       ...
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7

  8. #8
    Ciao Ragazzi, eccovi il codice.Divertivi
    Ci sono 3 classi interne
    Listen
    Ricezione
    Invia

    [*CODE]
    //Importo i package
    import java.net.*;
    import java.io.*;
    import java.io.Reader;

    public class Server_Form extends javax.swing.JFrame {

    // contatore dei client attivi //
    int count = -1;
    // massimo 50 Client //
    int MAXCLIENT = 50;
    // Array di Socket per i client //
    Socket socket[] = new Socket[MAXCLIENT];
    // Socket di ascolto //
    ServerSocket serverSocket;


    /** Creates new form JFrame */
    public Server_Form() {
    try {
    serverSocket = new ServerSocket(7777);
    } catch (IOException e)
    {

    System.out.println("IOException: " + e);
    System.out.println("\nErrore verificatosi sull'apertura del socket sulla porta!\n");
    }
    initComponents();
    }

    /** This method is called from within the constructor to
    * initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is
    * always regenerated by the Form Editor.
    */
    private void initComponents() {
    jDesktopPane1 = new javax.swing.JDesktopPane();
    jTextPane1 = new javax.swing.JTextPane();
    jTextPane2 = new javax.swing.JTextPane();
    jButton3 = new javax.swing.JButton();
    jButton1 = new javax.swing.JButton();
    jLabel2 = new javax.swing.JLabel();
    jLabel1 = new javax.swing.JLabel();

    addWindowListener(new java.awt.event.WindowAdapter() {
    public void windowClosing(java.awt.event.WindowEvent evt) {
    exitForm(evt);
    }
    });

    jTextPane1.setEditable(false);
    jTextPane1.setBounds(60, 110, 260, 110);
    jDesktopPane1.add(jTextPane1, javax.swing.JLayeredPane.DEFAULT_LAYER);

    jTextPane2.setBounds(200, 230, 140, 30);
    jDesktopPane1.add(jTextPane2, javax.swing.JLayeredPane.DEFAULT_LAYER);

    jButton3.setText("Click me for Listen");
    jButton3.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
    jButton3MouseClicked(evt);
    }
    });

    jButton3.setBounds(100, 280, 160, 60);
    jDesktopPane1.add(jButton3, javax.swing.JLayeredPane.DEFAULT_LAYER);

    jButton1.setText("Dati da inviare");
    jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
    jButton1MouseClicked(evt);
    }
    });

    jButton1.setBounds(20, 230, 160, 30);
    jDesktopPane1.add(jButton1, javax.swing.JLayeredPane.DEFAULT_LAYER);

    jLabel2.setFont(new java.awt.Font("Times New Roman", 3, 24));
    jLabel2.setText("DATI RICEVUTI");
    jLabel2.setBounds(70, 60, 210, 40);
    jDesktopPane1.add(jLabel2, javax.swing.JLayeredPane.DEFAULT_LAYER);

    jLabel1.setText("Server non in ascolto");
    jLabel1.setBounds(50, 20, 270, 50);
    jDesktopPane1.add(jLabel1, javax.swing.JLayeredPane.DEFAULT_LAYER);

    getContentPane().add(jDesktopPane1, java.awt.BorderLayout.CENTER);

    pack();
    }

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
    // TODO add your handling code here:
    Invia invia = new Invia(this);
    invia.start();
    }

    private void jButton3MouseClicked(java.awt.event.MouseEvent evt) {
    // TODO add your handling code here:
    Listen listen = new Listen(this , serverSocket);
    listen.start();
    }

    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
    System.exit(0);
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
    Server_Form MyForm = new Server_Form();
    MyForm.setSize(400 , 400);
    MyForm.show();
    //MyForm.jButton1.setEnabled(false);
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton3;
    private javax.swing.JDesktopPane jDesktopPane1;
    public javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    public javax.swing.JTextPane jTextPane1;
    public javax.swing.JTextPane jTextPane2;
    // End of variables declaration

    }

    class Listen extends Thread {

    private ServerSocket server_socket;

    private Server_Form frame;

    /**
    * Creates a new instance of Listen
    */
    public Listen(Server_Form serverframe, ServerSocket socketascolto) {
    this.server_socket = socketascolto;
    this.frame = serverframe;
    }

    public void run() {
    // Ciclo infinito in attesa di client , non ci dimentichiamo che l'accept è bloccante //
    while(true) {
    try {
    frame.jLabel1.setText("SERVER IN ASCOLTO SULLA PORTA 7777");
    System.out.println("In attesa di chiamate dai Client... ");
    frame.count++;
    frame.socket[frame.count] = server_socket.accept();

    System.out.println("Ho ricevuto una chiamata di apertura da:\n" + frame.socket[frame.count]);
    Ricezione ricezione = new Ricezione(frame.socket[frame.count] , frame);
    ricezione.start();


    } catch (IOException e) {
    System.out.println("IOException: " + e);}
    }
    }

    }

    class Ricezione extends Thread {

    private Socket Connesso;

    private Server_Form frame;

    /**
    * Creates a new instance of Ricezione
    */
    public Ricezione(Socket Connesso_ric, Server_Form frame_ric) {
    this.Connesso = Connesso_ric;
    this.frame = frame_ric;
    }

    public void run() {
    // Ciclo infinito in attesa di client , non ci dimentichiamo che l'accept è bloccante //
    String old;
    try {
    DataInputStream is = new DataInputStream(Connesso.getInputStream());

    InputStreamReader(Connesso.getInputStream()));

    while(true) {

    System.out.println("STO RICEVENDO DATI");
    String userInput = is.readLine();
    System.out.println("Ricevuto " + userInput);
    if (userInput == null || userInput.equals("QUIT"))
    break;
    if (frame.jTextPane1.getText() != null) {
    old = frame.jTextPane1.getText() + "\n" + userInput;}
    else {
    old = userInput;}
    frame.jTextPane1.setText(old);

    System.out.println("Il Client ha scritto: " + userInput);
    }
    //d.close();
    is.close();
    }
    catch (IOException e) {
    System.out.println("IOException: " + e);
    }

    }

    }

    class Invia extends Thread {

    private Server_Form frame;

    /**
    * Creates a new instance of Invia
    */
    public Invia(Server_Form frame_ric) {
    this.frame = frame_ric;
    }

    public void run() {
    String Dati_inviare;
    try {
    for(int i=0 ; i < frame.count ; i++) {
    DataOutputStream os = new DataOutputStream(frame.socket[i].getOutputStream());
    Dati_inviare = frame.jTextPane2.getText();
    System.out.println("DATI da inviare" + Dati_inviare);
    os.writeBytes(Dati_inviare);
    System.out.println("DATI INVIATI");
    //os.close();
    }
    } catch (IOException e) {
    System.out.println("IOException: " + e);
    }

    }

    }
    [*/CODE]

    Un pò lungo Vero?Ma altrettanto interessante...

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Dylan_Web
    Con il mio codice riesco ad inviare e ricevere dati dai client, ma solo sotto forma di stringa.
    Vorrei se possibile inviare e ricevere una struct... tutti mi hanno detto che devo serializzare e deserializzare.Ma con rispetto parlando non so nemmeno cosa significhi.
    codice:
    x inviare:
    
    ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream())
    
    objOut.writeObject(oggetto da inviare (che implementa Serializable));
    
    x ricevere:
    
    ObjectInputStream objIn = new ObjectInputStream(socket.getInpuStream());
    
    Object obj = objIn.readObject();

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Per favore, non inserire risposte in discussioni concluse da tempo.
    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.