Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123

    [Java] Socket client, problema connessione a server

    Ciao a tutti,

    è la prima volta che utilizzo Socket e ServerSocket.
    Sino a che ho utilizzato il localhost va tutto bene...ma se volessi lasciare il client ad un pc connesso ad internet..come faccio a farlo connettere al mio pc? Ho utilizzato il mio ip, ma senza risultati...

    Grazie a tutti! ^^

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    24
    se funziona il locale non dovrebbero esserci particolari problemi.. lanci il server e poi lanci il client comunicandogli indirizzo e porta d'ascolto del server.

  3. #3

    Re: [Java] Socket client, problema connessione a server

    Originariamente inviato da Patrick Jane
    Ciao a tutti,

    è la prima volta che utilizzo Socket e ServerSocket.
    Sino a che ho utilizzato il localhost va tutto bene...ma se volessi lasciare il client ad un pc connesso ad internet..come faccio a farlo connettere al mio pc? Ho utilizzato il mio ip, ma senza risultati...

    Grazie a tutti! ^^
    Devi necessariamente comunicare l'iIP (e la porta, che tuttavia è costante) al tuo client; se non disponi di un IP statico ma dinamico (per intenderci, che cambia ad ogni connessione) potresti utilizzare servizi come questo: http://www.dyndns.com/.


    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Grazie a tutti per le risposte! ^^

    Il problema era elementare in quanto non aprivo la porta su Alice

    Domande:
    1) @MdE2005: Puoi darmi più info riguardanti il sito?

    2) Supponiamo io volessi lasciare il server a qualc'un altro, questo dovrebbe per forza aprire la sua porta sul router. Questo problema non è per caso, in qualche arcano modo, risolvibile?
    è seccante far smanettare un utente sul router per aprire una porta...

    Grazie a tutti! ^^

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Patrick Jane
    Domande:
    1) @MdE2005: Puoi darmi più info riguardanti il sito?
    Scusa ma non puoi leggere cosa dice sul sito di dyndns?? Comunque non è l'unico. Questi servizi funzionano in generale così: ti forniscono un hostname (generalmente ti fanno scegliere il terzo livello del nome di dominio, es. tuascelta.lorodominio.xyz) e poi ti forniscono un piccolo software che devi lanciare e tenere in esecuzione sul PC. Questo software di tanto in tanto va ad aggiornare le loro mappature sui loro DNS per tenere "agganciato" il hostname con il reale IP (che ovviamente può cambiare ... altrimenti non sarebbe "dinamico") che la tua connessione ad internet ha di volta in volta.

    Originariamente inviato da Patrick Jane
    Questo problema non è per caso, in qualche arcano modo, risolvibile?
    è seccante far smanettare un utente sul router per aprire una porta...
    No, non si può, detto in generale. Ci sono una marea di router e la infrastruttura di rete potrebbe essere ancora più varia e complessa di un semplice router.
    Quindi ogni infrastruttura di rete è a sé stante e va visto caso per caso. Senza contare eventuali firewall "software".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da andbin
    Scusa ma non puoi leggere cosa dice sul sito di dyndns??
    Generalmente guardo sempre prima di chiedere...ma provando a leggere non ci ho capito quasi nulla (il mio inglese lascia un pò a desiderare)..quindi chiedo venia ^^

    Originariamente inviato da andbin
    Comunque non è l'unico. Questi servizi funzionano in generale così: ti forniscono un hostname (generalmente ti fanno scegliere il terzo livello del nome di dominio, es. tuascelta.lorodominio.xyz) e poi ti forniscono un piccolo software che devi lanciare e tenere in esecuzione sul PC. Questo software di tanto in tanto va ad aggiornare le loro mappature sui loro DNS per tenere "agganciato" il hostname con il reale IP (che ovviamente può cambiare ... altrimenti non sarebbe "dinamico") che la tua connessione ad internet ha di volta in volta.
    Ok, grazie! ^^ Mi informerò meglio in merito..oppure troverò una "strada alternativa" (che dovrei aver trovato) per risolvere questo problema.

    Originariamente inviato da andbin
    No, non si può, detto in generale. Ci sono una marea di router e la infrastruttura di rete potrebbe essere ancora più varia e complessa di un semplice router.
    Quindi ogni infrastruttura di rete è a sé stante e va visto caso per caso. Senza contare eventuali firewall "software".
    Ok... va bene, come immaginavo.

    Grazie a tutti! ^^

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Chiedo scusa per il doppio post.

    Avrei una domanda...

    Sto facendo alcune prove con delle canzoni...prima tutto bene, si sentivano bene! Ora invece capita con alcune che si sentano dei suoni in mezzo...si sentono male insomma.. quale può essere la causa?

    Server...ingresso thread
    codice:
      public void run() {
        try {
          OutputStream s1out = client.getOutputStream();
          BufferedOutputStream bw = new BufferedOutputStream(s1out);
    	  BufferedInputStream br = new BufferedInputStream(new FileInputStream("canzone.mp3"));
    	  
    	  byte[] array = new byte[1024];
    	  int b;
    	  while((br.read(array,0,1024) != -1)) {
    	    bw.write(array,0,1024);
    		array = new byte[1024];
    	  }
    	  System.out.println("Client scollegato!");
    	  br.close();
    	  bw.close();
    	  client.close();
        } catch(Exception e) {e.printStackTrace();}
      }
    client...lettura e creazione file
    codice:
      void lettura() {
        try {
    	  System.out.println("Lettura dati!");
    	  // Leggo i dati dal Socket
    	  InputStream is = socket.getInputStream();
    	  BufferedInputStream bis = new BufferedInputStream(is);
    	  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file.mp3"));
    	  
    	  byte[] array = new byte[1024];
    	  while((bis.read(array,0,1024)) != -1) {
    	    bos.write(array,0,1024);
    		array = new byte[1024];
    	  }
    	  
    	  System.out.println("Lettura completata!");
    	  bis.close();
    	  bos.close();
    	  socket.close();
    	} catch(Exception e) {e.printStackTrace();}
      }
    Cosa sbaglio?

    Se volete i codici di client e server chiedete pure ^^

    Grazie! ^^

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Patrick Jane
    Generalmente guardo sempre prima di chiedere...ma provando a leggere non ci ho capito quasi nulla (il mio inglese lascia un pò a desiderare)..quindi chiedo venia ^^

    Ok, grazie! ^^ Mi informerò meglio in merito..oppure troverò una "strada alternativa" (che dovrei aver trovato) per risolvere questo problema.
    Tieni presente che ci sono anche certi router ADSL che sono in grado di comunicare direttamente con un servizio di "dynamic dns".

    Ad esempio il mio Netgear DG834Gv5 supporta proprio dyndns.org (che comunque non ho mai provato). Basta specificargli nome host/utente/password e ci pensa il router a inviare le notifiche al servizio.


    Originariamente inviato da Patrick Jane
    codice:
    	  byte[] array = new byte[1024];
    	  int b;
    	  while((br.read(array,0,1024) != -1)) {
    	    bw.write(array,0,1024);
    		array = new byte[1024];
    	  }
    Il loop è fondamentalmente sbagliato e inappropriato. Innanzitutto non serve istanziare ogni volta un nuovo array! Basta uno solo e riusarlo ad ogni ciclo.

    Poi comunque il concetto è che lo stream di dati o file in generale non è detto che sia un multiplo esatto della lunghezza del buffer!! Quindi NON puoi scrivere sempre 1024 byte, l'ultimo "chunk" (pezzo) potrebbe essere meno di 1024 byte.

    Quindi devi considerare la lunghezza che restituisce il read() e usare sempre questa nella lunghezza della write().

    In sostanza:

    codice:
    while ((len = is.read(buffer)) != -1) {
        os.write(buffer, 0, len);
    }
    Tutto qui.
    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.