Autore Topic: Client-Server android  (Letto 1054 volte)

Offline Smoke666

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Client-Server android
« il: 03 Luglio 2013, 23:42:35 CEST »
0
Ciao a tutti, sto cercando di implementare un semplice sistema client server. L'unico problema è che io vorrei che il server fosse su un dispositivo android, e i client altri dispositivi. Conosco abbastanza bene le tecniche di programmazione concorrente, ma non ho mai implementato qualcosa di simile in ambiente android e non so come muovermi. Ad esempio, come può il server creare un socket di rete al quale i vari client possono connettersi?

Grazie in anticipo!

Offline theBaffo

  • Utente normale
  • ***
  • Post: 164
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1
Re:Client-Server android
« Risposta #1 il: 04 Luglio 2013, 10:37:17 CEST »
0
Dai un occhiata qui e qui  ;-)
Se ti sono stato utile, premi "thanks" ;)

"Errare è umano, ma per incasinare davvero tutto è necessario un computer" - Arthur Bloch

Offline Andrea Di Lello

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Win 7
Re:Client-Server android
« Risposta #2 il: 22 Luglio 2013, 16:55:02 CEST »
0
Ciao,

sto prendendo spunto dai link che hai postato (... thanks!  ;-) )

ho aperto 2 istanze di eclipse con 2 workspace e 2 emulatori separati uno per la parte server ed uno per la parte client.
La parte client crasha subito con una FATAL EXCEPTION MAIN

qui di seguito il logcat:

Codice: [Seleziona]
07-22 13:45:59.039: E/AndroidRuntime(2157): FATAL EXCEPTION: main
07-22 13:45:59.039: E/AndroidRuntime(2157): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.clientsend/com.example.clientsend.ClientSend}: android.os.NetworkOnMainThreadException
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.os.Handler.dispatchMessage(Handler.java:99)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.os.Looper.loop(Looper.java:137)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.ActivityThread.main(ActivityThread.java:5041)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at java.lang.reflect.Method.invokeNative(Native Method)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at java.lang.reflect.Method.invoke(Method.java:511)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at dalvik.system.NativeStart.main(Native Method)
07-22 13:45:59.039: E/AndroidRuntime(2157): Caused by: android.os.NetworkOnMainThreadException
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at libcore.io.IoBridge.connect(IoBridge.java:112)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at java.net.Socket.startupSocket(Socket.java:566)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at java.net.Socket.<init>(Socket.java:225)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at com.example.clientsend.ClientSend.onCreate(ClientSend.java:38)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.Activity.performCreate(Activity.java:5104)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-22 13:45:59.039: E/AndroidRuntime(2157):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-22 13:45:59.039: E/AndroidRuntime(2157):         ... 11 more
07-22 13:46:02.770: I/jdwp(2157): Ignoring second debugger -- accepting and dropping
07-22 13:46:03.380: I/Process(2157): Sending signal. PID: 2157 SIG: 9

grazie per l'attenzione a presto!

Andrea
« Ultima modifica: 22 Luglio 2013, 16:57:46 CEST da Andrea Di Lello »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Client-Server android
« Risposta #3 il: 22 Luglio 2013, 17:02:43 CEST »
0
Se fai una ricerca sul forum con la parola chiave android.os.NetworkOnMainThreadException troverai tonnellate di post sull'argomento e indicazioni su come risolverlo.

Riassumendo: non si può aprire una connessione nel thread dell'UI (più banalmente non si si possono aprire connessioni di rete dal codice di un'activity).
Devi ricorrere ad un AsyncTask da lanciare che: effettui la connessione, recuperi/invii i dati, ritorni il risultato (se necessario) al chiamante effettuando eventuali aggiornamenti dei campi visualizzati.

Offline Andrea Di Lello

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Win 7
Re:Client-Server android
« Risposta #4 il: 22 Luglio 2013, 17:38:49 CEST »
0
grazie mille li sto leggendo ^_^

EDIT:

Buondì, ho provato ad usare AsyncTask, usando solo [doInBackground()] ma ricevo la stessa eccezione, è la prima volta che provo ad usare AsyncTask, in effetti non sono sicuro di aver fatto bene dal punto di vista logico della struttura java e della app

( ho preso spunto da quì per usare AsyncTask : L'eccezione android.os.NetworkOnMainThreadException &raquo;Luca Zanini )
qui di seguito il codice:

Codice: [Seleziona]
package com.example.clientsend;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.util.Log;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View;
import android.os.AsyncTask;

public class ClientSend extends Activity {
        private Button invia;
        private TextView txt;
        private Socket socketC;
        private String serverIP = "10.10.45.90";
        private static final int PORTASERVER_REDIRETTA = 5000;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_client_send);
                invia = (Button) findViewById(R.id.button1);
                txt = (TextView) findViewById(R.id.textView1);
                try{
                        InetAddress ipAddress = InetAddress.getByName(serverIP);
                        socketC = new Socket(ipAddress, PORTASERVER_REDIRETTA);
                }catch(UnknownHostException e){
                        e.printStackTrace();
                }catch(IOException e){
                        e.printStackTrace();
                }
                new ActionButton().execute();               
        }
        private class ActionButton extends AsyncTask{
                @Override
                protected Object doInBackground(Object...objects){
                        invia.setOnClickListener(new OnClickListener(){
                                public void onClick(View v){
                                        try{
                                                // prendere il testo dal componente "Editext" e metterlo in una stringa
                                                EditText edit = (EditText) findViewById(R.id.editText1);
                                                String str = edit.getText().toString();
                                                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socketC.getOutputStream())), true);
                                                out.println(str);
                                                Log.d("Client", "il Client ha inviato il messaggio");
                                        }catch(UnknownHostException e1){
                                                txt.setText("Error: Host sconosciuto");
                                                e1.printStackTrace();
                                        }catch(IOException e1){
                                                txt.setText("Error: IO");
                                                e1.printStackTrace();
                                        }catch(Exception e1){
                                                txt.setText("Error");
                                                e1.printStackTrace();
                                        }
                                }
                        });
                        return null;
                }
        }
}

Read you Soon

Andrea
« Ultima modifica: 25 Luglio 2013, 11:36:38 CEST da Andrea Di Lello »

Offline smartgatto

  • Utente junior
  • **
  • Post: 96
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S5
  • Sistema operativo:
    Windows 7
Re:Client-Server android
« Risposta #5 il: 11 Maggio 2015, 21:10:07 CEST »
0
Scusate se riesumo questo post... vorrei fare una cosa del genere però i due smartphone non sono connessi nella stessa rete wifi ma solo in 3G.
Come posso fare per recuperare gli indirizzi IP dei rispettivi telefoni?

grazie!