2015-03-20 15 views
6

Sto cercando di sviluppare un'applicazione Android in grado di scambiare dati su connessione peer-to-peer con altri dispositivi senza server. Quindi, per favore, suggerisci come posso farlo. Grazie in anticipo.Come posso connettere due dispositivi Android via socket senza server

+0

Lo fai come qualsiasi altra comunicazione socket. – HamZa

+0

@HamZa Puoi dare qualsiasi riferimento come sono nuovo nella comunicazione socket. –

+0

Non vuoi nemmeno fare un android come server e l'altro è client – ashutiwari4

risposta

3

Java fornisce ServerSocket e Socket per comunicare dispositivi b/n. Uno dei dispositivi che puoi realizzare come server e altri dispositivi che puoi creare come client e comunicare in bianco e nero senza introdurre server ospitato su alcune macchine.

L'opzione Altro e migliore è Utilizzo di Wi-Fi Peer-to-Peer. WifiP2pManager aiutarti a raggiungere il tuo scopo. Here è un esempio.

3

Questo è un codice completo per chat tramite SocketProgramming senza server.

Nella mia applicazione, per prima cosa sei un cliente e cerchi un server. Quando non si trova alcun server, si diventa un server e si attende un client.

public class MainActivity extends ActionBarActivity { 

private Handler handler = new Handler(); 
private TextView text; 
private EditText input; 
private Button send; 
private Socket socket; 
private DataOutputStream outputStream; 
private BufferedReader inputStream; 
private String DeviceName = "Device"; 

private boolean searchNetwork() { 
    log("Connecting"); 
    String range = "192.168.56."; 
    for (int i = 1; i <= 255; i++) { 
     String ip = range + i; 
     try { 
      socket = new Socket(); 
      socket.connect(new InetSocketAddress(ip, 9000), 50); 
      outputStream = new DataOutputStream(socket.getOutputStream()); 
      inputStream = new BufferedReader(new InputStreamReader(
        socket.getInputStream())); 
      DeviceName += "1"; 
      Log.i("Server", DeviceName); 
      log("Connected"); 
      return true; 
     } catch (Exception e) { 
     } 
    } 
    return false; 

} 

private void runNewChatServer() { 
    ServerSocket serverSocket; 
    try { 
     serverSocket = new ServerSocket(9000); 
     log("Waiting for client..."); 
     socket = serverSocket.accept(); 
     DeviceName += "2"; 
     log("a new client Connected"); 
    } catch (IOException e) { 
    } 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    text = (TextView) findViewById(R.id.text); 
    input = (EditText) findViewById(R.id.input); 
    send = (Button) findViewById(R.id.send); 
    Thread thread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       if (!searchNetwork()) { 
        runNewChatServer(); 

       } 

       outputStream = new DataOutputStream(
         socket.getOutputStream()); 
       inputStream = new BufferedReader(new InputStreamReader(
         socket.getInputStream())); 
       while (true) { 

        String Message = inputStream.readLine(); 
        if (Message != null) { 
         log(Message); 
        } 
       } 
      } catch (IOException e) { 
       log("Error: IO Exception"); 
       e.printStackTrace(); 
      } 
     } 
    }); 
    send.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      if (outputStream == null) { 
       return; 
      } 
      try { 
       String Message = input.getText().toString() + "\n"; 
       outputStream.write(Message.getBytes()); 
       log2(input.getText().toString()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      input.setText(""); 
     } 
    }); 
    thread.start(); 

} 

private void log(final String message) { 
    handler.post(new Runnable() { 
     String DeviceName2=""; 
     @Override 
     public void run() { 
      if (DeviceName.equals("Device1")) { 
       DeviceName2 = "Device2"; 
      }else if(DeviceName.equals("Device2")) { 
       DeviceName2 = "Device1"; 
      }else{ 
       DeviceName2 = "UnknowDevice"; 
      } 

      text.setText(text.getText() + "\n" + DeviceName2 + " :" 
        + message); 

     } 
    }); 
} 
private void log2(final String message) { 
    handler.post(new Runnable() { 

     @Override 
     public void run() { 


      text.setText(text.getText() + "\n" + "you" + " :" 
        + message); 

     } 
    }); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     if (socket != null) { 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     System.exit(0); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

} 
+0

Presenta un'ipotesi sulla subnet mask. Invece, è meglio inviare un datagramma sull'ip broadcast della rete, qualcosa come dettagliato qui: http://michieldemey.be/blog/network-discovery-using-udp-broadcast/ –

1

Se siete alla ricerca di tali P2P su una rete locale, ci sono due parti ad esso:

  1. scoperta coetanei
  2. Comunicare con i coetanei

Tra le API Android , è possibile utilizzare Network Service Discovery APIs per questo o Wifi P2P Service Discovery APIs.

C'è una libreria wrapper che li utilizza internamente e ha una documentazione comparativamente migliore - Salut, che può anche essere usata.

Ho anche creato a library for P2P - Near, che utilizza le prese direttamente. Il problema che stavo affrontando con le API Android era che la scoperta non si verificava con certezza ogni volta e il problema sottostante era sconosciuto.

Se stai cercando il P2P su Internet, socket IO è una soluzione prevalente. Anche Near dovrebbe essere in grado di facilitare i trasferimenti se si forniscono gli indirizzi IP e non si trovano dietro i firewall NAT.

1

Il vostro progetto ha un grosso problema: ...

Se non c'è alcun server centrale alcuni dispositivi Android dovrebbero agire come client e altri come assistente ma questo non funzionerà in alcune situazioni:

  • Quando il provider di telefonia mobile assegna IP privato e non pubblico

  • Quando il dispositivo è connesso a una rete Wi-Fi ma nessuna regola NAT è definita sul router.

In entrambi i casi il problema è che la porta di ascolto del dispositivo che deve fungere da server è irraggiungibile.

Problemi correlati