2015-03-20 9 views
6

Próbuję stworzyć aplikację na Androida, która może wymieniać dane w sieciach równorzędnych z innymi urządzeniami bez serwera. Więc proszę zasugeruj, jak mogę to zrobić. Z góry dziękuję.Jak podłączyć dwa urządzenia z Androidem przez gniazdo bez serwera

+0

Robisz to jak każdą inną komunikację z gniazdem. – HamZa

+0

@HamZa Czy możesz podać wszelkie odniesienia, ponieważ jestem nowy w komunikacji gniazda. –

+0

Nie chcesz nawet tworzyć jednego androida jako serwera, a innym klientem jest – ashutiwari4

Odpowiedz

3

Java zapewnia ServerSocket i Socket do komunikacji urządzeń czarno-białych. Jedno z urządzeń, które możesz wykonać jako serwer i inne urządzenie, które możesz wykonać jako klient i komunikować się b/w bez wprowadzania serwera hostowanego na jakimś komputerze.

Inna i lepsza opcja to Używanie Wi-Fi Peer-to-Peer. WifiP2pManager pomoże ci osiągnąć cel. Here jest przykładem.

3

To jest kompletny kod do czatowania przez SocketProgramming bez serwera.

W mojej aplikacji najpierw jesteś klientem i szukasz serwera. Kiedy nie znajdziesz żadnego serwera, stajesz się serwerem i czekasz na klienta.

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

Ma to założenie na masce podsieci. Zamiast tego możesz lepiej wysyłać datagram na transmisyjnym adresie IP sieci, coś tak szczegółowo tutaj: http://michieldemey.be/blog/network-discovery-using-udp-broadcast/ –

1

Jeśli szukasz takiego P2P w sieci lokalnej, istnieją dwie części do niego:

  1. Wykrywanie peerów
  2. komunikowania się z rówieśnikami

Wśród Android API , możesz użyć do tego celu Network Service Discovery APIs lub Wifi P2P Service Discovery APIs.

Istnieje biblioteka otoki, która korzysta z nich wewnętrznie i ma stosunkowo lepszą dokumentację - Salut, z której można również korzystać.

Stworzyłem także a library for P2P - Near, który bezpośrednio korzysta z gniazd. Problem, z którym miałem do czynienia w przypadku interfejsów API Androida, polegał na tym, że odkrycie nie odbywało się z pewnością za każdym razem, a podstawowy problem był nieznany.

Jeśli szukasz sieci P2P w Internecie, powszechnym rozwiązaniem jest socket IO. Nawet w pobliżu powinno być w stanie ułatwić transfery, jeśli podasz adresy IP i nie są one za zaporami NAT.

1

Twój projekt ma duży problem: ...

Jeśli nie ma centralnego serwera niektóre android urządzenia powinny działać jako klient i serwer jak inni, ale to nie będzie działać w niektórych sytuacjach:

  • Gdy dostawca telefonii komórkowej przypisuje prywatne i niepubliczne urządzenie IP

  • Gdy urządzenie jest podłączone do sieci Wi-Fi, ale nie ma zdefiniowanej reguły NAT na routerze.

W obu przypadkach problemem jest to, że port odsłuchiwania urządzenia, który musi działać jako serwer, jest niedostępny.

Powiązane problemy