Autore Topic: SOCKET ANDROID: client comunica col server ma server non comunica col client  (Letto 3222 volte)

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
salve a tutti volevo fare una piccola chat android per due cellulari e ho provato a utilizzare il codice usato in questo tutorial:
http://http://www.youtube.com/watch?v=KgOrhLu5XUo

pur avendo dato i permessi per internet contrariamente al tizio muto del video a me il client riesce a ricevere la stringa dal server ma il serve non riesce a ricevere il messaggio dal client.
Facendo delle prove con un server in java e con telnet ho visto che l'app client funziona (invia il messaggio)
il tutorial utilizza l'idirizzo 127.0.0.1 e provando le due app in locale sullo stesso avd mostra il corretto funzionamento delle stesse, nel mio caso le app non funzionano ne sullo stesso avd ne con l'indirizzo 10.0.2.2 ne con 10.0.2.15 (letto dalle info dell' avd) ne su due dispositivi fisici.

potreste darmi qualche suggerimento?
ringrazio anticipatamente chi mi dedicherà un minuto.

%SERVER CODE
MainActivity.java
Codice: [Seleziona]
package com.example.serversocket;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity implements DataDisplay {
TextView serverMessage;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                serverMessage=(TextView)findViewById(R.id.textView1);
               
        }
        public void connect(View view)
        {
                MyServer server= new MyServer();
                server.setEventListener(this);
                server.startListening();
        }
        public void Display(String message)
        {
                serverMessage.setText(""+message);
        }

       

}

DataDisplay.java
Codice: [Seleziona]
package com.example.serversocket;

public interface DataDisplay {
void Display(String message);

}

MySever.java
Codice: [Seleziona]
package com.example.serversocket;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import android.os.Handler;
import android.os.Message;

public class MyServer {
        Thread m_objThread;
        ServerSocket m_server;
        String m_strMessage;
        DataDisplay m_dataDisplay;
        Object m_connected;
       
        public MyServer()
        {
       
        }
        public void setEventListener(DataDisplay dataDisplay)
        {
                m_dataDisplay=dataDisplay;
               
        }
        public void startListening()
        {
                m_objThread= new Thread(new Runnable() {
                       
                       
                        public void run()
                        {
                                try{
                                       
                                m_server= new ServerSocket(2001);
                                Socket connectedSocket = m_server.accept();
                                Message clientmessage=Message.obtain();
                                ObjectInputStream ois = new ObjectInputStream(connectedSocket.getInputStream());
                                String strMessage=(String) ois.readObject();
                                clientmessage.obj=strMessage;
                                mHandler.sendMessage(clientmessage);
                                ObjectOutputStream oos = new ObjectOutputStream(connectedSocket.getOutputStream());
                                oos.writeObject("Connected");
                       
                                oos.flush();
                                ois.close();
                                oos.close();
                                m_server.close();
                                }catch (Exception e)
                                {
                                        Message msg3=Message.obtain();
                                        msg3.obj=e.getMessage();
                                        mHandler.sendMessage(msg3);
                                }
                }});
                m_objThread.start();
                }
       
Handler mHandler = new Handler(){};
public void handleMessage(Message status){
        m_dataDisplay.Display(status.obj.toString());
}
};


%Client code
MainActivity.java
Codice: [Seleziona]
package com.example.clientsocket;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

import java.net.*;

public class MainActivity extends Activity {
TextView serverMessage;
Thread m_objThreadClient;
Socket clientSocket;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                serverMessage = (TextView)findViewById(R.id.textView1);
               
        }
        public void Start(View view)
        {
                m_objThreadClient=new Thread(new Runnable() {
                        public void run()
                        {
                                try
                                {
                                        clientSocket = new Socket("127.0.0.1",2001);
                                        ObjectOutputStream oos =new ObjectOutputStream(clientSocket.getOutputStream());
                                        oos.writeObject("Hallo there");
                                        Message serverMessage= Message.obtain();
                                       
                                        ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
                                        String strMessage = (String)ois.readObject();
                                        serverMessage.obj=strMessage;
                                       
                                        mHandler.sendMessage(serverMessage);
                                        oos.flush();
                                        oos.close();
                                        ois.close();
                                       
                                }catch (Exception e)
                                {
                                        e.printStackTrace();
                                }
                        }
                });
                m_objThreadClient.start();
        }
Handler mHandler = new Handler() {
        public void handleMessage(Message msg){
                messageDisplay(msg.obj.toString());
        }
};
public void messageDisplay(String servermessage)
{
        serverMessage.setText(""+servermessage);
}
       
        }


Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #1 il: 10 Novembre 2013, 11:05:48 CET »
0
up

Offline Eighteen

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsumg galaxy s3
  • Play Store ID:
    Segantin%20alessio&hl=it
  • Sistema operativo:
    Ubuntu, Sabayon , Windows
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #2 il: 19 Novembre 2013, 12:28:10 CET »
0
Se è la prima volta che utilizzi le socket ti consiglio di provare a fare piccoli programmini in java giusto per capire il funzionamento di esse. Oltre a questo ti consiglio di lasciar perdere per ora gli ObjectInputream e ObjectOutputStream. Prova piuttosto con Scanner e PrintStream.

Poi non ho capito se vuoi fare comunicare 2 dispositivi android o un dispositivo android con un pc

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #3 il: 19 Novembre 2013, 12:54:34 CET »
0
ciao,appena posso proverò, la cosa che mi lascia sconcertato è che funziona solo in un senso, cmq l'idea sarebbe quella di creare una chat tra due telefonini android, solo che avendo qualche conoscenza di java ho fatto un tentativo tra un server java e il client android.
ps. per caso avresti tu un esempio di socket funzionante tra due android?
 grazie

Offline Eighteen

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsumg galaxy s3
  • Play Store ID:
    Segantin%20alessio&hl=it
  • Sistema operativo:
    Ubuntu, Sabayon , Windows
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #4 il: 19 Novembre 2013, 12:59:56 CET »
0
Tra due android purtroppo no. Solo tra android e pc, ma in teoria il concetto dovrebbe essere il medesimo. Prova a modificare il programma utilizzando i metodi che ti ho suggerito, cosi da rendere il programma più semplice senza l' utilizzo del message. Con printStream invii comuni stringhe per cui è già una semplificazione in più :-D

Inviato dal mio GT-I9300 utilizzando Tapatalk


Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #5 il: 19 Novembre 2013, 13:02:40 CET »
0
ok proverò, grazie 1000!!!

Offline Eighteen

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsumg galaxy s3
  • Play Store ID:
    Segantin%20alessio&hl=it
  • Sistema operativo:
    Ubuntu, Sabayon , Windows
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #6 il: 19 Novembre 2013, 13:04:19 CET »
0
Appena ho un momento ti posto anche due classi java che comunicano tramite socket :-D

Inviato dal mio GT-I9300 utilizzando Tapatalk


Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #7 il: 19 Novembre 2013, 13:05:15 CET »
0
grazie lo stesso ma di quelle ne ho a bizzeffe, ho da poco fatto l'esame ;)

Offline Eighteen

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsumg galaxy s3
  • Play Store ID:
    Segantin%20alessio&hl=it
  • Sistema operativo:
    Ubuntu, Sabayon , Windows
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #8 il: 19 Novembre 2013, 13:07:11 CET »
0
Allora prendi quelle e le implementi nelle activity. Ricorda che devono essere utilizzate all interno di thread altrimenti se l'activity cambia la connessione cade

Inviato dal mio GT-I9300 utilizzando Tapatalk


Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #9 il: 19 Novembre 2013, 13:43:31 CET »
0
io feci esattamente così, ma mi crashava l'app non appena doveva connettersi, per questo hp cercato un esempio android e ho trovato quel codice che pero' funziona in una sola dir.
penso ci sia una qualche differenza tra la gestione dei thread di java e android

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #10 il: 19 Novembre 2013, 13:59:09 CET »
0
Facendo delle prove con un server in java e con telnet ho visto che l'app client funziona (invia il messaggio)
il tutorial utilizza l'idirizzo 127.0.0.1 e provando le due app in locale sullo stesso avd mostra il corretto funzionamento delle stesse, nel mio caso le app non funzionano ne sullo stesso avd ne con l'indirizzo 10.0.2.2 ne con 10.0.2.15 (letto dalle info dell' avd) ne su due dispositivi fisici.

potreste darmi qualche suggerimento?
ringrazio anticipatamente chi mi dedicherà un minuto.

Ma quale indirizzo IP usi per connettere client a server?

Dovendo fare un'app del genere uno dei problemi principali secondo me è l'IP. Perchè ad esempio l'emulatore sta in una sua rete locale virtualizzata dalla virtual machine dell'emulatore. Se vuoi avere visibilità "completa" nella rete locale fisica (quella del PC sui cui gira la VM dell'emulatore) devi dare qualche comanda ADB per istruire il "NAT" dell'emulatore (vedi qua ports and networking Android Debug Bridge | Android Developers ). Se poi sei connesso 3G, la connessione diretta tramite IP credo sia impossibile, a causa dei vari livello di NAT dei provider telefonici.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #11 il: 19 Novembre 2013, 14:06:04 CET »
0
si ho visto anche questo , con esito negativo ma cmq una volta scaricata l'app sui due telefoni nella stessa rete locale penso che avrebbe dovuto funzionare

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #12 il: 19 Novembre 2013, 14:25:59 CET »
0
si ho visto anche questo , con esito negativo ma cmq una volta scaricata l'app sui due telefoni nella stessa rete locale penso che avrebbe dovuto funzionare

Ma hai usato un l'IP assegnato al telefono, oppure hai lasciato clientSocket = new Socket("127.0.0.1",2001); ?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #13 il: 19 Novembre 2013, 14:43:36 CET »
0
con i dispositivi fisici ho usato gli indirizzi di rete che leggevo dalle info dei tel, su avd ho utilizzato si a 127.0.0.1 che 10.0.2.2 inoltre sull einfo del tel nell avd c'e 10.0.2.15 ma anche con questo nada

Offline aledpa

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:SOCKET ANDROID: client comunica col server ma server non comunica col client
« Risposta #14 il: 21 Novembre 2013, 12:20:51 CET »
0
Ciao,
(non so se è la sezione giusta per scrivere questo, sono nuovo del forum)
mi trovo di fronte ad una problematica simile e vorrei un consiglio; scrivo lo scenario:
una app android che gira su device (lo provo su emulatore, ma dovrà poi girare su device fisico) si deve collegare ad un server java su pc per scaricare un database (o comunque una serie di informazioni), per fare login e per inserire nuove informazioni.

Vorrei chiedervi consiglio in merito al fatto che usare una comunicazione via socket (sul server java un ServerSocket che sta in ascolto e sgancia un thread a cui da un socket per gestirsi il client) sia una soluzione valida (premetto che con questa mi so "muovere" abbastanza bene) o sia meglio usare un server nel quale mettere l'applicazione java (in questo sono proprio all'abc) usando qualche framework particolare.

Spero possiate consigliarmi!