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

    [JAVA] Problema connessione server, socket

    import java.net.*;
    import java.io.*;

    class Server extends Thread
    {
    private ServerSocket mioServer;
    private Socket client;

    public Server(Socket socket)
    {
    System.out.println("Arrivato un nuovo client da "+client.getInetAddress());
    client=socket;
    }

    public void run()
    {
    /*
    Il codice che si occupa della comunicazione con il client
    è contenuto in questo metodo (run()) che viene chiamato
    automaticamente quando un thread viene mandato in esecuzione
    (cioè quando si richiama il metodo Start()
    */
    try
    {
    int msg;
    InputStream In=client.getInputStream();
    OutputStream Out=client.getOutputStream();
    PrintStream video=new PrintStream(Out);
    video.println("Benvenuti sul server di IBC");
    video.println();

    ByteArrayOutputStream comando=new ByteArrayOutputStream();
    while ((msg=In.read())>-1)
    {
    Out.write(msg);
    if (msg ==13) // Nuova riga
    {
    video.println();
    try
    {
    Thread.sleep(3000);
    }
    catch (Exception errore)
    {
    break;
    }
    } else if (msg!=10) // Carriage return
    {
    comando.write(msg);
    }
    }
    }
    catch (Exception errore)
    {
    errore.printStackTrace();
    } finally {
    System.out.println("Connessione chiusa con "+client.getInetAddress());
    try
    {
    client.close();
    }
    catch (Exception errore)
    {
    errore.printStackTrace();
    }
    }
    }

    public static void main(String[] args) throws Exception
    {
    int porta=1024;
    Socket client;
    ServerSocket mioServer;

    System.out.println("Server in partenza sulla porta "+porta);
    mioServer=new ServerSocket(porta);
    System.out.println("Server avviato sulla porta "+porta);

    /*
    Ciclo infinito in cui viene eseguito il metodo accept()
    in attesa della richiesta di un client
    */
    while(true) {
    System.out.println("In attesa di connessioni...");
    client=mioServer.accept(); // Restituisce un oggetto Socket

    /*
    Ricevuta la richiesta si crea un nuovo oggetto della classe
    (e quindi un nuovo thread), passando ad esso la socket relativa
    a tale connessione, e viene lanciato così un nuovo thread di esecuzione
    */
    System.out.println("Richiesta di connessione da "+client.getInetAddress());
    (new Server(client)).start();

    // Si ritorna ad eseguire il metodo accept()
    }
    }
    }

    Va finchè non mi collego tramite client (output in rosso), dopodichè dà quest'errore (output in blu)

    ---------- Esegui ----------
    Server in partenza sulla porta 1024
    Server avviato sulla porta 1024
    In attesa di connessioni...

    Richiesta di connessione da /127.0.0.1
    java.lang.NullPointerException
    at Server.<init>(Server.java:11)
    at Server.main(Server.java:93)
    Exception in thread "main" Normal Termination
    Output completed (28 sec consumed).



    Cos'è?
    Andrea Gianfreda
    Designer on Makezone
    Milano, Como, Lugano, Lecce

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Guarda il costruttore della tua classe Server:
    codice:
    public Server (Socket socket) {
       System.out.println("Arrivato un nuovo client da "+client.getInetAddress()); 
       client=socket; 
    }
    Dovresti mettere socket.getInetAddress() perchè client non è inizializzata nella seconda copia di Server che chiami alla fine del main() con l'istruzione (new Server(client)).start();


    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

  3. #3
    Originariamente inviato da LeleFT
    Guarda il costruttore della tua classe Server:
    codice:
    public Server (Socket socket) {
       System.out.println("Arrivato un nuovo client da "+client.getInetAddress()); 
       client=socket; 
    }
    Dovresti mettere socket.getInetAddress() perchè client non è inizializzata nella seconda copia di Server che chiami alla fine del main() con l'istruzione (new Server(client)).start();


    Ciao.
    giusto! :quipy: grazie, è stata un"sbadatezza"...
    Andrea Gianfreda
    Designer on Makezone
    Milano, Como, Lugano, Lecce

  4. #4
    come sarebbe possibile scrivere nel client e visualizzare ciò che viene scritto sul server ed eventualmente sugli altri client (tipo chat)

    Andrea Gianfreda
    Designer on Makezone
    Milano, Como, Lugano, Lecce

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Capita a chiunque... e quante volte!! Soprattutto in applicazioni Client/Server...



    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

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da makeZoner's
    come sarebbe possibile scrivere nel client e visualizzare ciò che viene scritto sul server ed eventualmente sugli altri client (tipo chat)

    Devi fare in modo che il client mandi al server un oggetto di tipo Stringa. Per far questo basta che tu usi un oggetto di tipo ObjectOutputStream con la socket sul lato client (un oggetto ObjectInputStream sul lato server) e mandi tramite il metodo writeObject() la stringa al server.

    Se vuoi puoi anche mandare un'oggetto creato da te l'importante è che implementi Serializable (una interfaccia vuota!). In questo caso, quindi, puoi controllare il tipo di messaggio inviato e altre cose.

    Poi, sul lato server, devi rifare il tutto per gli altri (eventuale) client, facendo in modo che il server invii ad ognuno di essi una copia del messaggio ricevuto.


    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
    Originariamente inviato da LeleFT
    Devi fare in modo che il client mandi al server un oggetto di tipo Stringa. Per far questo basta che tu usi un oggetto di tipo ObjectOutputStream con la socket sul lato client (un oggetto ObjectInputStream sul lato server) e mandi tramite il metodo writeObject() la stringa al server.

    Se vuoi puoi anche mandare un'oggetto creato da te l'importante è che implementi Serializable (una interfaccia vuota!). In questo caso, quindi, puoi controllare il tipo di messaggio inviato e altre cose.

    Poi, sul lato server, devi rifare il tutto per gli altri (eventuale) client, facendo in modo che il server invii ad ognuno di essi una copia del messaggio ricevuto.


    Ciao.
    se hai del tempo, potresti fornirmi del codice?

    una guida sul networking che ho qui davanti mette a disposizione InputStream e OutputStream... che sono, a che servono? Sono bufferizzabili?
    Andrea Gianfreda
    Designer on Makezone
    Milano, Como, Lugano, Lecce

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    InputStream e OutputStream sono gli oggetti con i quali costruire gli ObjectInputStream e ObjectOutputStream.
    Ecco del codice d'esempio (supponiamo che la Socket si chiami, per comodità socket):
    codice:
    --- Lato Client ---
    
    ObjectInputStream ois;
    ObjectOutputStream oos;
    try {
       // Costruisco l'oggetto per ricevere i messaggi dal server
       ois = new ObjectInputStream( socket.getInputStream() );
    
       // Costruisco l'oggetto per mandare i messaggi al server
       oos = new ObjectOutputStream( socket.getOutputStream() );
    
       // Mando un messaggio al server
       oos.writeObject("Ciao, io sono il client!");
    
       // attendo la risposta dal server
       String risposta = ((String) ois.readObject());
    
       // Stampo la risposta del server
       System.out.println("Il server ha risposto: " + risposta);
    } catch (Exception e) {}
    
    
    --- Lato server ---
    ObjectInputStream ois;
    ObjectOutputStream oos;
    try {
       // Costruisco l'oggetto per ricevere i messaggi dal client
       ois = new ObjectInputStream( socket.getInputStream() );
    
       // Costruisco l'oggetto per mandare i messaggi al client
       oos = new ObjectOutputStream( socket.getOutputStream() );
    
       // attendo un messaggio dal client
       String messaggio = ((String) ois.readObject());
    
       // Stampo il messaggio del client
       System.out.println("Il client mi ha mandato un messaggio: " + messaggio);
    
       // Mando la risposta
       oos.writeObject("Messaggio ricevuto.");
    
    } catch (Exception e) {}
    Ovviamente questa cosa è semplicemente dimostrativa: il server sa che il client gli manderà il messaggio, quindi lo attende ed il client, viceversa, sa che dopo aver inviato un messaggio al server, riceverà una risposta. Cosa che in una chat non succede per niente: il server non sa QUANDO riceverà un messaggio dal client ed il client a sua volta non sa SE riceverà un messaggio dal server.

    Per modellare questa situazione, uno strumento valido sono i thread: basta inserire l'oggetto di ricezione messaggi in un thread (sia nel server che nel client), in modo che quando arriva un messaggio se ne occupi lui. Per i messaggi in uscita è semplice: quando l'utente invia il messaggio il client effettua una chiamata al metodo writeObject(). Di solito il server non invia messaggi di sua iniziativa, ma si occupa semplicemente di rispedire un messaggio di un utente agli altri client collegati, quindi la chiamata al metodo writeObject() nel server dovrà per forza seguire la ricezione di un messaggio.

    Gli oggetti InputStream e OutputStream possono essere utilizzati anche per costruire degli oggetti BufferedInputStream e BufferedOutputStream.


    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

  9. #9
    Graande! grazie!

    Originariamente inviato da LeleFT
    InputStream e OutputStream sono gli oggetti con i quali costruire gli ObjectInputStream e ObjectOutputStream.
    Ecco del codice d'esempio (supponiamo che la Socket si chiami, per comodità socket):
    codice:
    --- Lato Client ---
    
    ObjectInputStream ois;
    ObjectOutputStream oos;
    try {
       // Costruisco l'oggetto per ricevere i messaggi dal server
       ois = new ObjectInputStream( socket.getInputStream() );
    
       // Costruisco l'oggetto per mandare i messaggi al server
       oos = new ObjectOutputStream( socket.getOutputStream() );
    
       // Mando un messaggio al server
       oos.writeObject("Ciao, io sono il client!");
    
       // attendo la risposta dal server
       String risposta = ((String) ois.readObject());
    
       // Stampo la risposta del server
       System.out.println("Il server ha risposto: " + risposta);
    } catch (Exception e) {}
    
    
    --- Lato server ---
    ObjectInputStream ois;
    ObjectOutputStream oos;
    try {
       // Costruisco l'oggetto per ricevere i messaggi dal client
       ois = new ObjectInputStream( socket.getInputStream() );
    
       // Costruisco l'oggetto per mandare i messaggi al client
       oos = new ObjectOutputStream( socket.getOutputStream() );
    
       // attendo un messaggio dal client
       String messaggio = ((String) ois.readObject());
    
       // Stampo il messaggio del client
       System.out.println("Il client mi ha mandato un messaggio: " + messaggio);
    
       // Mando la risposta
       oos.writeObject("Messaggio ricevuto.");
    
    } catch (Exception e) {}
    Ovviamente questa cosa è semplicemente dimostrativa: il server sa che il client gli manderà il messaggio, quindi lo attende ed il client, viceversa, sa che dopo aver inviato un messaggio al server, riceverà una risposta. Cosa che in una chat non succede per niente: il server non sa QUANDO riceverà un messaggio dal client ed il client a sua volta non sa SE riceverà un messaggio dal server.

    Per modellare questa situazione, uno strumento valido sono i thread: basta inserire l'oggetto di ricezione messaggi in un thread (sia nel server che nel client), in modo che quando arriva un messaggio se ne occupi lui. Per i messaggi in uscita è semplice: quando l'utente invia il messaggio il client effettua una chiamata al metodo writeObject(). Di solito il server non invia messaggi di sua iniziativa, ma si occupa semplicemente di rispedire un messaggio di un utente agli altri client collegati, quindi la chiamata al metodo writeObject() nel server dovrà per forza seguire la ricezione di un messaggio.

    Gli oggetti InputStream e OutputStream possono essere utilizzati anche per costruire degli oggetti BufferedInputStream e BufferedOutputStream.


    Ciao.
    Andrea Gianfreda
    Designer on Makezone
    Milano, Como, Lugano, Lecce

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.