Autore Topic: UnknownHostException in Socket  (Letto 906 volte)

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
UnknownHostException in Socket
« il: 30 Gennaio 2016, 16:12:46 CET »
0
Ciao, sto realizzando un'applicazione client tramite Android Studio, per connettermi ad un applicazione server scritta in Visual C#.

Purtroppo sono incappato nell'eccezione "UnknownHostException".
Ora nel file "AndroidManifest.xml" è naturalmente presente la stringa

Codice: [Seleziona]
<uses-permission android:name="android.permission.INTERNET" />
Mentre il codice effettivo dell'applicazione è il seguente:

Codice: [Seleziona]
package com.example.skynet.clientsocket;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;

import java.io.IOException;
import java.net.Socket;
import java.lang.*;

public class MainActivity extends AppCompatActivity {

    // Variabili
String messaggio = "";
    String indirizzoIP = "";
    int porta = 0;
    Socket client;

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        // Codice del programma
Button btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
                client = new Socket("192.168.1.3",11000);

            }
        });
    }

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
       // automatically handle clicks on the Home/Up button, so long
       // as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

        //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

L'eccezione viene generata sull'istruzione:

Codice: [Seleziona]
client = new Socket("192.168.1.3",11000);
L'indirizzo "192.168.1.3" è quello della macchina locale. Ho provato anche con "127.0.0.1", "localhost" ecc...

Suggerimenti? Grazie!

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:UnknownHostException in Socket
« Risposta #1 il: 30 Gennaio 2016, 21:12:02 CET »
0
Probabilmente varia lato server un log che dice "new user acces...".
Quindi se da browser di android vai su 192.x.x.x:1100 il server vede la connessione?

Ho sempre saputo che socket e serversocket dovessero andare in un thread separato. Tu fai tutto nel mainthread. Non so non credo sia questo il proboema

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
Re:UnknownHostException in Socket
« Risposta #2 il: 30 Gennaio 2016, 23:28:21 CET »
0
La connessione funziona, ho provato ad inserire un WebView e raggiungo l'URL senza nessun problema.
L'errore viene segnalato non appena digito

Codice: [Seleziona]
client = new Socket("192.168.1.3", 11000);
Senza neanche compilare, non capisco perchè. Cercando su Google vedo che è un problema diffuso ma non ho ancora trovato una soluzione.
Dipende da impostazioni di Android Studio?

EDIT:

Il codice ora è il seguente:

Codice: [Seleziona]
package com.example.skynet.provasocket;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebView;
import android.widget.Button;

import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {

    // Variabili
    public Socket client = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        // Codice del programma

        Button btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        client = new Socket("192.168.1.3", 11000);

                    }
                }).start();

            }
        });


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
« Ultima modifica: 30 Gennaio 2016, 23:29:59 CET da Piero78 »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:UnknownHostException in Socket
« Risposta #3 il: 30 Gennaio 2016, 23:46:40 CET »
0
Aspetta. Se dici che nemmeno compila come fai ad avere un eccezione

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
Re:UnknownHostException in Socket
« Risposta #4 il: 31 Gennaio 2016, 00:26:45 CET »
0
Appena ho terminato di digitare la linea di codice:

Codice: [Seleziona]
client = new Socket("192.168.1.3", 11000);
Mi vengono immediatamente segnalate una java.net.unknownhostexception e una java.io.ioexception. Non ne comprendo il motivo.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:UnknownHostException in Socket
« Risposta #5 il: 31 Gennaio 2016, 00:31:00 CET »
0
Credo tu debba mettere l'istruzione dentro un blocco try catch a sto punto.

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
Re:UnknownHostException in Socket
« Risposta #6 il: 31 Gennaio 2016, 00:47:31 CET »
0
Lo ho fatto, ma se viene generata una eccezione significa che qualcosa non va. Su Intenet ci sono una infinità di esempi, ma il codice continua a generare eccezioni.

Offline zezzo

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +3
    • Mostra profilo
Re:UnknownHostException in Socket
« Risposta #7 il: 31 Gennaio 2016, 01:33:11 CET »
0
Ciao, ma all'inizio del tuo file nella sezione degli import è presente tra le righe questa?

import java.net.Socket;


Post unito: 31 Gennaio 2016, 01:36:42 CET
Anche quetsta "import java.io.IOException;" se dichiari la tua try catch cosi:

                        try {
                            client = new Socket("192.168.1.3", 11000);
                        } catch (IOException e) {
                           //gestisci errore....
                        }
« Ultima modifica: 31 Gennaio 2016, 01:36:42 CET da zezzo, Reason: Merged DoublePost »

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
Re:UnknownHostException in Socket
« Risposta #8 il: 31 Gennaio 2016, 02:00:45 CET »
0
Ciao, si la "java.net.Socket" è presente.
Il punto non è tanto gestire le eccezioni, il fatto è che se si verificano il programma non può funzionare. Non posso richiamare InputStream e OutputStream.
Devo capire perchè si verificano. Mi viene da pensare che siano impostazioni dell'Android Studio.

Offline zezzo

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +3
    • Mostra profilo
Re:UnknownHostException in Socket
« Risposta #9 il: 31 Gennaio 2016, 02:06:00 CET »
0
Ah ok!! Ho suggerito gli import perchè pensavo che tu non riuscissi proprio a compilare.
Cmq toglimi un curiosità nellla prova con la WebView che dicevi hai interrogato oltre che lo stesso ip anche la stessa porta?

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
Re:UnknownHostException in Socket
« Risposta #10 il: 31 Gennaio 2016, 14:38:28 CET »
0
No, con la WebView sono rimasto sulla porta 80.

Offline zezzo

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +3
    • Mostra profilo
Re:UnknownHostException in Socket
« Risposta #11 il: 31 Gennaio 2016, 15:02:24 CET »
0
ok se comunque ha ricevuto una risposta escludiamo un problema di IP (stessa rete).

La tua applicazione server scritta in Visual C#, presumo sia su una macchina win, vedi con il prompt dei comandi lo stato della porta se è attiva e in LISTENING
usa il comando netstat -n nella seconda colonna dovresti avere qual'cosa come 192.168.1.1:1100 (tuoIP:tuaPorta) nell' ultima colonna lo stato della porta.

Se è positivo anche questo, probabile che ci sia un firewall/antivirus sulla macchina che fa da server, o anche semplicemente qual'cosa di sistema tipo win defender che blocca la tua porta o le attività di rete della tua applicazione server.

In bocca al lupo.

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
Re:UnknownHostException in Socket
« Risposta #12 il: 31 Gennaio 2016, 16:12:32 CET »
0
Ho risolto con questa sintassi:

Codice: [Seleziona]
package com.example.skynet.clientsocket;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;

import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class MainActivity extends AppCompatActivity {

    // Variabili globali
    Socket client = null;
    String indIP = "";
    int porta = 0;
    String msg = "";
    byte[] messaggio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        // Codice del programma

        final EditText ip = (EditText) findViewById(R.id.editText);
        final EditText port = (EditText) findViewById(R.id.editText2);
        final EditText msgClient = (EditText) findViewById(R.id.editText3);
        Button btn = (Button) findViewById(R.id.button);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                indIP = ip.getText().toString();
                porta = Integer.parseInt(port.getText().toString());
                msg = msgClient.getText().toString() + "<EOF>";
                messaggio = msg.getBytes(StandardCharsets.US_ASCII);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            client = new Socket(indIP, porta);

                            OutputStream out = client.getOutputStream();
                            out.write(messaggio);
                        }
                        catch (Exception ex) {}
                    }
                }).start();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Ora l'invio dei dati avviene senza problemi. Grazie per l'aiuto!
« Ultima modifica: 31 Gennaio 2016, 16:14:26 CET da Piero78 »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:UnknownHostException in Socket
« Risposta #13 il: 31 Gennaio 2016, 19:10:31 CET »
0
Si chiama blocco try catch. È di java...non di android.
Ti consiglio di gestire l'eccezione. O comunque fare un log

Offline Piero78

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Tablet
  • Sistema operativo:
    Windows 7
Re:UnknownHostException in Socket
« Risposta #14 il: 01 Febbraio 2016, 14:40:39 CET »
0
Il blocco try...catch lo conosco bene, quello che non mi spiegavo è il perchè mi venisse segnalato errore in fase si stesura del codice. Ad esempio in Visual C#, al limite, l'errore viene segnalato in compilazione. Per quello sono rimasto disorientato.