Newsgroup: it.comp.java
Titolo: socket e differenze fra unix e windows

salve,
ho scritto un programmino che  comunica attraverso la  rete con dei
terminali poco intelligenti che emulano la seriale su ethernet, questo
programma l'ho sviluppato sotto linux con eclipse e funziona!!. Poi felice
come una pasqua porto le mie brave classi su windows e scopro che il
programma si comporta in modo diverso, mi va sempre in time out la
connessione.
naturalmente da windows pingo il terminale e ho disabilitato il firewall di
windows, questa è la parte di codice che crea il socket
public class TerminalBase{
   public TerminalBASE() throws UnknownHostException, IOException {
        socket = new Socket(192.168.1.103, 1001);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
}
c'è qualcuno che ha da darmi qualche suggerimento per fare dei test per
poter capire perchè questa differenza?
grazie a tutti


Prova a vedere se riesci a collegarti usando un programmino piu' 
semplice: telnet. Avvialo dal Prompt dei comandi telnet:
	telnet 192.168.1.103 1001
Oppure se hai nmap installato fai un probing della porta 1001 e vedi se 
aperta. Non mi ricordo la sintassi ma la capisci facendo nmap --help.
Mi sembra che anche con netcat (sempre da installare) tu possa scrivere 
su una socket ma non sono sicuro e non conosco la sintassi. E non so se 
hanno fatto la versione per windows ma mi sembra di sì.
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html

 
allora ho installato eclipse e mazzi vari su win e ho ricompilato il
progetto, la situazione migliora ma non va meglio, il terminale sembra
rispondere ma la risposta non è leggibile, dovrebbe rispondere con dei
caratteri definiti ma arriva di tutto :-(
a questo punto credo di aver fatto una cappella nell'implementazione della
classe, o sbaglio ad aprire il socket o sbaglio a leggere e scrivere sugli
streams in e out, altro pezzettino di codice...
public class TerminalBASE {
    public TerminalBASE(String ip, int port, String terminale)
            throws UnknownHostException, IOException {
        setNumeroTerminale(terminale);
        setPort(port);
        setIp(ip);
        socket = new Socket(getIp(), getPort());
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    protected void sendString(char[] s) throws IOException {
        out.write(s);
        out.flush();
    }
    protected String readString() throws IOException {
        String ret = "";
        CharBuffer charBuff = CharBuffer.allocate(LUNGHEZZA + CONTROLLO);
        int readed = in.read(charBuff);
        charBuff.rewind();
        while (ret.length() < readed) {
            ret += charBuff.get();
        }
        return ret;
    }
    public String comando(){
        sendString(comando);
        System.out.println(readString());
    }
}
questo è un'estratto della classe. secondo voi il fatto che io chiami le due
funzioni, sendString e readString una dietro l'altra in questo modo può
dare problemi?
grazie

Umberto Carrara (20/10/2008):

Hai voglia di fare una prova, giusto per curiosità? Mi è venuto un
piccolo sospetto...
Compila questa classe ed eseguila prima su linux e poi su windows, e
posta i risultati:
----------------- TestReader.java
import java.io.*;
public class TestReader {
   public static void main(String[] args) {
      try {
         InputStreamReader reader=new InputStreamReader(System.in);
         System.out.println(reader.getEncoding());
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}
-----------------
-- 
Scientology: se la conosci la eviti, se la conosci non ti uccide...
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx
 - 
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)
---> 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 <---

 
linux
ISO8859_1
windows
Cp1252
ok ora che hai giustificato il tuo nickname spiegami come posso liberarmi da
questo guazzabuglio :D
in pratica tu dici che diverso charset influenza la codifica della stringa
che invio/ricevo dal terminale?
se questo è il problema ho la possibilità di avere lo stesso comportamento
su diversi charset?

 su diversi charset?
Non proprio, ma potresti provare ad usare uno degli altri costruttori
di InputStreamReader, specificando un charset uguale per tutti:
in = new BufferedReader(
       new InputStreamReader(socket.getInputStream(), "ISO8859_1")
     );
Vedi un po' se le cose migliorano...


 su diversi charset?
Non proprio, ma potresti provare ad usare uno degli altri costruttori
di InputStreamReader, specificando un charset uguale per tutti:
out = new PrintWriter(
         new OutputStreamWriter(socket.getOutputStream(), "ISO8859_1")
      , true);
in = new BufferedReader(
       new InputStreamReader(socket.getInputStream(), "ISO8859_1")
     );
Vedi un po' se le cose migliorano...
-- 


 su diversi charset?
Non proprio, ma potresti provare ad usare uno degli altri costruttori
di InputStreamReader / OutputStreamWriter, specificando un charset
uguale per tutti:
out = new PrintWriter(
         new OutputStreamWriter(socket.getOutputStream(), "ISO8859_1")
      , true);
in = new BufferedReader(
       new InputStreamReader(socket.getInputStream(), "ISO8859_1")
     );
Vedi un po' se le cose migliorano...
-- 


 
...allora ho usato quelle e poi ho modificato il metodo che legge in modo di
non convertire il buffer di caratteri in stringa prima di fare i controlli
con lo xor (mi server per sapere se ho una stringa valida o meno)
protected char [] readString() throws IOException {
 
                CharBuffer charBuff = CharBuffer.allocate(LUNGHEZZA + CONTROLLO);
                int readed = in.read(charBuff);
                charBuff.rewind();
                char [] ret = new char[readed];
                int count = 0;
                while (charBuff.hasRemaining() && count < readed) {
                        ret[count] =  charBuff.get();
                        count++;
                }
                return ret;
        }
grazie mille dell'aiuto
un chupachups virtuale ;-)