Autore Topic: problema socket e DataInputStream  (Letto 820 volte)

Offline Andrew McBlues

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
problema socket e DataInputStream
« il: 16 Aprile 2013, 10:53:22 CEST »
0
Ciao a tutti!

sono piuttosto newbie in java e android, quindi perdonatemi :)

sto facendo un app che dovrebbe aprire  un socket e trasmettere due numeri ad un server (netcat per ora)

ma mi si chiude con un errore:

04-16 10:25:38.266: E/AndroidRuntime(1703): FATAL EXCEPTION: AsyncTask #2
04-16 10:25:38.266: E/AndroidRuntime(1703): java.lang.RuntimeException: An error occured while executing doInBackground()
04-16 10:25:38.266: E/AndroidRuntime(1703):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.lang.Thread.run(Thread.java:856)
04-16 10:25:38.266: E/AndroidRuntime(1703): Caused by: java.lang.ClassCastException: java.net.PlainSocketImpl$PlainSocketInputStream cannot be cast to java.io.DataInputStream
04-16 10:25:38.266: E/AndroidRuntime(1703):    at com.example.hallowifi.ConnectionHandler.doInBackground(ConnectionHandler.java:33)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at com.example.hallowifi.ConnectionHandler.doInBackground(ConnectionHandler.java:1)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
04-16 10:25:38.266: E/AndroidRuntime(1703):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

il caused by è piuttosto chiaro... ma non capisco come ovviare.. ecco il codice (preso paro paro da internet :)

Codice: [Seleziona]

public static String serverip = "192.168.1.2";
        public static int serverport = 7777;
        Socket s;
        public DataInputStream dis;
        public DataOutputStream dos;
        public int message;

        @Override
        protected Void doInBackground(Void... params) {

            try {
                Log.i("AsyncTank", "doInBackgoung: Creating Socket");
                s = new Socket(serverip, serverport);
            } catch (Exception e) {
                Log.i("AsyncTank", "doInBackgoung: Cannot create Socket");
            }
            if (s.isConnected()) {
                try {
                    dis = (DataInputStream) s.getInputStream();
                    dos = (DataOutputStream) s.getOutputStream();
                    Log.i("AsyncTank", "doInBackgoung: Socket created, Streams assigned");

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected");
                    e.printStackTrace();
                }
            } else {
                Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket is closed");
            }
            return null;
        }

        public void writeToStream(double lat, double lon) {
            try {
                if (s.isConnected()){
                    Log.i("AsynkTask", "writeToStream : Writing lat, lon");
                     dos.writeDouble(lat);
                     dos.writeDouble(lon);
                } else {
                    Log.i("AsynkTask", "writeToStream : Cannot write to stream, Socket is closed");
                }
            } catch (Exception e) {
                Log.i("AsynkTask", "writeToStream : Writing failed");
            }
        }

viene lanciata dalla mainActivity.java cosi:

Codice: [Seleziona]
ConnectionHandler conhandler = new ConnectionHandler();
                    conhandler.execute();
                    conhandler.writeToStream(lat , lon);


se cambio DataInputStream in InuputStream non fa il cast, non da errore , ma il try/catch solleva l'eccezione e non mi scrive nulla

spero di essere stato chiaro!

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:problema socket e DataInputStream
« Risposta #1 il: 16 Aprile 2013, 12:44:28 CEST »
0
al posto di fare il cast prova a fare new DataInputStream(s.getInputStream());

Offline Andrew McBlues

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:problema socket e DataInputStream
« Risposta #2 il: 16 Aprile 2013, 13:27:53 CEST »
0
al posto di fare il cast prova a fare new DataInputStream(s.getInputStream());

ok, il crash non avviene, ma il try/catch solleva un eccezione di tipo nullPointer!

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:problema socket e DataInputStream
« Risposta #3 il: 16 Aprile 2013, 15:10:11 CEST »
0
se il socket è null allora non è avvenuta la connessione

Offline Andrew McBlues

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:problema socket e DataInputStream
« Risposta #4 il: 16 Aprile 2013, 16:12:47 CEST »
0
se il socket è null allora non è avvenuta la connessione

scusa, non ho specificato quale try/cacth :)

quello del metodo writeToStream

in pratica il socket dovrebbe funzionare, ma al momento di inviare i dati, solleva l'eccezione:

Codice: [Seleziona]

public void writeToStream(double lat, double lon) {
            try {
                if (s.isConnected()){
                    Log.i("AsynkTask", "writeToStream : Writing lat, lon");
                     dos.writeDouble(lat);
                     dos.writeDouble(lon);
                } else {
                    Log.i("AsynkTask", "writeToStream : Cannot write to stream, Socket is closed");
                }
            } catch (Exception e) {
                Log.i("AsynkTask", "writeToStream : Writing failed");
                e.printStackTrace();
            }
        }


04-16 16:09:58.504: I/AsynkTask(7048): writeToStream : Writing failed
04-16 16:09:58.514: I/AsyncTank(7048): doInBackgoung: Creating Socket
04-16 16:09:58.634: I/AsyncTank(7048): doInBackgoung: Socket created, Streams assigned
04-16 16:09:58.644: W/System.err(7048): java.lang.NullPointerException
04-16 16:09:58.654: W/System.err(7048):    at com.example.hallowifi.ConnectionHandler.writeToStream(ConnectionHandler.java:50)


Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:problema socket e DataInputStream
« Risposta #5 il: 16 Aprile 2013, 16:37:56 CEST »
0
eh non so che dirti anche perchè non sono a casa,prova a debuggare e controllare tutte le variabili

Offline Andrew McBlues

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:problema socket e DataInputStream
« Risposta #6 il: 16 Aprile 2013, 16:42:56 CEST »
0
eh non so che dirti anche perchè non sono a casa,prova a debuggare e controllare tutte le variabili

ok, grazie lo stesso! :) ora vedo