Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    io sto cercando di far comunicare un palmare cn un pc utilizzando il wireless...
    ho molti dubbi...
    quando faccio new socket nel client e devo specificare indirizzo IP, quale devo mettere? il dubbio mi viene perchè il pc ha un indirizzo dinamico con cui si connette alla rete.. posto il mio codice per farvi capire meglio, il client è il mio palmare e il server il mio pc.
    se li faccio partire il server arriva ad aspettare il client e il client non fa new socket ecc ecc... e da eccezione di timout di connessione...
    codice:
    public class Server {
     
    	/*Definizione del numero massimo di connessioni*/
    	private final static int MAX_CONNECTION = 10;
    
    	/*Inizio procedura principale del server*/
        public static void StartServer(){
        	/*Dichiaro la socket del server*/
            ServerSocket sk = null;
            /*Dichiaro la socket del client*/
            Socket client = null;
            /*variabile contatore per il numero massimo di client*/
            int i = 0;
     
            /*Cattura degli errori nel caso in cui verificasse un eccezione IOException
            nello stabilimento di una connessione tra server e client*/
            try{
                /*Creo un nuovo socket del server in cui indico
                 il numero della porta 80 ed il numero massimo di connessioni accettabili*/
                sk = new ServerSocket(8080, MAX_CONNECTION);
                   /*ciclo per il limite di connessioni*/
               while(i < MAX_CONNECTION){
       
                   /*accetto la connessione del client*/
                    client = sk.accept();
                     /*evoco una subroutine che svolga le funzioni dedicate al client*/
                    ServiziClient(client);
                    i++;
               }
                /*chiusura della socket del server*/
                sk.close();
            }
            /*Gestione Errori*/
           catch(IOException e){
                System.out.println("Errore di I/O.");
           }
        }
     
        /*Questa procedura si occupa di una semplice lettura attraverso la socket,
         del messaggio proveniente dal client in formato stringa.*/
     
        private static void ServiziClient(Socket s){
            try{
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String msg;
               while ((msg = br.readLine())!= null){
                    System.out.println(msg);
                }
               br.close();
            }catch(IOException e){
                System.out.println("Errore nella lettura su canale");
           }
        }
    }
    codice:
    public class Client {
    	
        public static void StartClient(){
            /*Dichiaro la socket del server*/
            Socket s = null;
            /*Dichiaro il canale di scrittura*/
            PrintWriter pr = null;
            try{
                /*Connetto attravero la socket il client al server sulla porta 8080*/
                s = new Socket("79.42.59.54", 8080);
    
                /*Apro il canale di scrittura attraverso la socket*/
                pr = new PrintWriter(s.getOutputStream());
                pr.print("Ciao server!");
                /*Chiudo in ordine il canale di scrittura e la socket*/
                pr.close();
                s.close();
            }
            /*Cattuto l'errore di host sconosciuto che previene  eventuali url sbagliati del server*/
            catch(UnknownHostException e){
                System.out.println("Errore nel riconoscimento dell'Host.");
            }
            /*Catturo eventuali errori di scrittura su canale*/
            catch(IOException d){
                System.out.println("Errore si I/O.");
            }
        }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Aleb
    io sto cercando di far comunicare un palmare cn un pc utilizzando il wireless...
    Come ho già detto sopra, il mezzo "fisico" di trasmissione è totalmente indifferente per qualunque applicazione che usa i "socket". Gli host su una rete hanno un (almeno 1) indirizzo IP e i socket permettono di collegarsi ad un host (nome/IP) su una certa porta. Punto, tutto qui. Come si debba arrivare ad un altro host lo sa/determina il sistema.

    Originariamente inviato da Aleb
    il pc ha un indirizzo dinamico con cui si connette alla rete..
    Generalmente gli host che devono fornire un qualche "servizio" di rete è bene che abbiano un indirizzo IP statico .... insomma, noto, fisso. Su internet, per chi ha un IP dinamico e vuole comunque fornire un qualche servizio, ci sono dei servizi appositi di DDNS (Dynamic DNS) dove forniscono un "nome" fisso che è risolto volta per volta nell'indirizzo dinamico dell'host.

    Quindi, per concludere, puoi impostare un IP fisso sulla macchina che fa da server? Chi è che ti fornisce l'IP dinamico? Un altra macchina sulla rete LAN che ha il server DHCP?


    P.S. il secondo parametro del costruttore di ServerSocket, quello in cui tu hai passato MAX_CONNECTION (=10), non è il numero massimo di connessioni che il tuo programma può accettare!!! E il "backlog", la dimensione della "coda" in cui le richieste di connessione sono accodate.
    Immagina che ad un server arrivino così tante richieste di connessione e che il programma (per un motivo o un altro) non riesca a fare altrettante accept() così velocemente. Le richieste vengono accodate e quando la coda è piena, ulteriori richieste vengono subito rifiutate.
    Guardando il tuo sorgente poi si vede chiaramente che hai fatto un server detto "sequenziale" (o "iterativo"), ovvero solo 1 client per volta può essere servito. E questo perché non hai usato i "thread" per gestire le comunicazioni ognuna in un thread separato.
    Probabilmente per il tuo scopo tale scenario va benissimo. Ma almeno sappilo: così servi solo 1 client per volta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    come faccio a tenere in ascolto il server e comunque usare la mia applicazione? ho inserito server.starserver(); e la mia applicazione di defalult si blocca finchè non arriva qualcosa da un client. quello che fa è corretto, ma non è quello che voglio. Io ho un applicazione che l'utente deve usare e questa ogni tanto riceve una stringa da un palmare e la deve gestire. Inoltre dopo la prima stringa che arriva dal client, non riesco ad inviare altro dallo stesso client (presumo sia perchè il server non è + in ascolto).
    Grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Aleb
    come faccio a tenere in ascolto il server e comunque usare la mia applicazione? ho inserito server.starserver(); e la mia applicazione di defalult si blocca finchè non arriva qualcosa da un client.
    Tutta la gestione del server devi farla in un thread separato. E se dalla parte di gestione della comunicazione devi "passare" qualcosa al resto della applicazione (che usa Swing, giusto?) devi farlo con una certa attenzione, per le solite questioni del "threading" in Swing.

    Originariamente inviato da Aleb
    Inoltre dopo la prima stringa che arriva dal client, non riesco ad inviare altro dallo stesso client (presumo sia perchè il server non è + in ascolto).
    L'ho detto prima: hai fatto un server "sequenziale", è in grado di "servire" solo 1 client per volta. Finito di servire un client, ritorna in quel ciclo e con la accept() può accettare un'altra connessione.

    In teoria, un server dovrebbe sempre continuare ad accettare connessioni fino alla fine (ovvio) della applicazione. Quel test nel while (i < MAX_CONNECTION) lo trovo fuori luogo .... dopo tot connessioni il ServerSocket viene chiuso .... e che ti serve??

    E visto che in ServiziClient() fai un ciclo continuo di lettura di righe e dato che non termina mai di sua spontanea volontà (perché non hai ideato un "protocollo" che permetta al server di capire quando terminare), per uscire dal servizio è il client che deve chiudere la connessione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    riusciresti a farmi un esempio di cosa vuol dire gestire il server in un thread separato?
    come faccio poi a comunicare con l altra applicazione? (si è swing)


    per quanto riguarda il server sequenziale, ho tolto il while delle connessione, perchè stia sempre in ascolto devo mettere while(true)?

    non ho capito cosa vuoi dirmi per il ciclo delle righe nei serviziclient

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Aleb
    riusciresti a farmi un esempio di cosa vuol dire gestire il server in un thread separato?
    Mai usato i thread? Devi o implementare Runnable o estendere Thread. Nel secondo caso hai già un Thread, nel primo devi crearlo passando il Runnable. Nel run() devi mettere il tuo "lavoro". Il Thread lo fai partire con start().
    Non è difficile ... ma dovresti avere qualche "base" su questi argomenti. Puoi vedere qui sul tutorial della Sun.

    Originariamente inviato da Aleb
    come faccio poi a comunicare con l altra applicazione? (si è swing)
    No alt. L'applicazione è sempre quella, no? Solo che Swing ha il "suo" thread, il EDT (event dispatch thread) e l'accesso a qualunque componente della interfaccia (salvo pochi casi particolari) va fatto solo dal EDT.
    Se il tuo server gira in un thread a parte e vuoi settare qualcosa nella interfaccia grafica a seguito di quello che hai ricevuto dalla comunicazione, devi usare invokeLater()/invokeAndWait() di SwingUtilities per chiedere di far eseguire un Runnable nel contesto del EDT.

    Originariamente inviato da Aleb
    per quanto riguarda il server sequenziale, ho tolto il while delle connessione, perchè stia sempre in ascolto devo mettere while(true)?
    while(true) è tipico ma vuol dire che non termina mai!!! In questi casi generalmente è l'utente che deve killare la applicazione server in qualche modo.

    Se fai la gestione del ServerSocket in un thread separato, allora potresti fare in modo che la parte grafica, es. quando chiudi la finestra principale, faccia terminare il thread del server.
    E ovviamente, anche qui, la terminazione del server la devi fare in modo "cooperativo" e in modo appropriato (e ne ho già parlato diverse volte sul forum).

    Originariamente inviato da Aleb
    non ho capito cosa vuoi dirmi per il ciclo delle righe nei serviziclient
    Hai fatto:

    while ((msg = br.readLine())!= null)

    Ovvero "continua finchè readLine() non ritorna null". Ora la domanda è: quando ritorna null? Questo succede solo quando l'InputStream sottostante arriva a end-of-file. Ma l'InputStream non è come quello di un file, dove c'è una fine fisica ben precisa.
    L'InputStream di un socket ... è sempre in attesa di "qualcosa"!! Quindi per come hai gestito il servizio, l'unico modo di uscire dal ciclo è che il client chiuda la connessione (o ci siano problemi di rete o altro per cui va "giu" la connessione).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    provo a fare una cosa per volta altrimenti ci capisco sempre meno..
    per usare i thread devo fare:

    codice:
    public class Server extends Thread{
     
        public void run(){
              //QUI DENTRO DEVO METTERE TUTTO QUELLO CHE C'ERA IN STARTSERVER??
       }
    }
    la creazione del thread dove lo devo mettere??? Nella mia applicazione grafica appena la apro?
    codice:
          Thread t = new Thread(new Server());
          t.start();
    nel client per la realizzazione del thread devo cambiare qualcosa?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Aleb
    per usare i thread devo fare:

    codice:
    public class Server extends Thread{
     
        public void run(){
              //QUI DENTRO DEVO METTERE TUTTO QUELLO CHE C'ERA IN STARTSERVER??
       }
    }
    Praticamente sì, tutto quello che avevi lì dentro.

    Originariamente inviato da Aleb
    la creazione del thread dove lo devo mettere??? Nella mia applicazione grafica appena la apro?
    codice:
          Thread t = new Thread(new Server());
          t.start();
    No alt. Fai attenzione: Server è già un java.lang.Thread!!! Istanzia Server, invoca start() e basta. Non creare un altro oggetto Thread!

    Come locazione, puoi anche metterla nel main() se sai che deve sempre partire subito. Se avessi, per fare un esempio, un pulsante "Avvia server" o simile nella tua interfaccia, allora ovviamente sarebbe ancora diverso (e legato ad un evento).

    Originariamente inviato da Aleb
    nel client per la realizzazione del thread devo cambiare qualcosa?
    No, al client non importa nulla di come hai gestito il server dal punto di vista del "threading".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    140
    ok fino a qui ci sono...
    ora mi parte il server e anche l applicazione...
    una volta che il server riceve la stringa dal client mi deve andare a settare l'interfaccia grafica
    ovvero:
    codice:
    msg è il mess che il erver ha ricevuto
                   
                    StringTokenizer st=new StringTokenizer(msg);
                    ArrayList<Pietanza> arrayModel=new ArrayList<Pietanza>();
                    GuiScontrino.sc=new Scontrino();
                    String tav=st.nextToken();
                    GuiScontrino.sc.setTavolo(tav);
                    String data=st.nextToken();
                    GuiScontrino.sc.setData(new GregorianCalendar());
                    while(st.hasMoreTokens()){
                    	int codice=Integer.parseInt(st.nextToken());
                    	int quant=Integer.parseInt(st.nextToken());
                    	Pietanza trov=GuiInizio.mpartenza.ricercaP(codice);
                    	trov.setOrdinata(quant);
                    	arrayModel.add(trov);
                    	GuiScontrino.sc.ordini.add(trov);
                    }
                            
                	//scrivo numTavolo
    				GuiScontrino.tx1.setText(tav);
    				GuiScontrino.tavolo.setText(tav);
    				//srivo data nell anteprima scontrino
    				GuiScontrino.data.setText(GuiScontrino.sc.getData());
                    
                	for(Pietanza p:arrayModel){
            			GuiScontrino.table2.getModel().aggiungiRiga(p);
            		}
    tutto questo dove lo devo mettere? mi parlavi di invoke...

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Aleb
    tutto questo dove lo devo mettere? mi parlavi di invoke...
    Sì, oggetti della GUI, oggetti dei "model" (se non opportunamente "sincronizzati") vanno acceduti solo nel contesto del EDT ... non di un qualunque altro thread.
    Devi usare invokeLater() o invokeAndWait() (la differenza è che il secondo aspetta!) di SwingUtilities per chiedere che il run() di un tuo piccolo Runnable che passi venga eseguito nel EDT.

    E l'avevo già detto in altri momenti sicuramente, quando fai cose del tipo:

    GuiScontrino.sc.ordini.add(trov);
    o
    GuiScontrino.tavolo.setText(tav);

    è perché il "design" delle tue classi fa molta "acqua". Impara ed abituati a fare dei metodi che "espongono" le varie funzionalità e permettono di "nascondere" quello che c'è sotto .... non permettere che qualunque codice possa "entrare" in campi di oggetti e campi dei suoi campi, ecc.... così "brutalmente" in modo "pubblico".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.