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
risposta
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.
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);
}
}
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/ –
Se siete alla ricerca di tali P2P su una rete locale, ci sono due parti ad esso:
- scoperta coetanei
- 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.
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.
Lo fai come qualsiasi altra comunicazione socket. – HamZa
@HamZa Puoi dare qualsiasi riferimento come sono nuovo nella comunicazione socket. –
Non vuoi nemmeno fare un android come server e l'altro è client – ashutiwari4