J'apprends la programmation Android et Java par moi-même. Pour la pratique, j'ai développé quelques applications, et maintenant j'essaye d'écrire une application de chat. Donc, fondamentalement, je veux quelque chose comme WhatsApp. J'ai un programme de serveur également codé par moi fonctionnant dans mon ordinateur, et c'est ce que la conversation dans le système d'Android utilise pour communiquer. Donc, fondamentalement, tout est envoyé au serveur et le serveur fait ce qu'il faut pour livrer les messages.
Voici donc ce que j'ai:Sockets Android: l'écoute ne fonctionne pas à travers 4G
- D'abord, mon application envoie un « Bonjour » à mon serveur (IP connu et le port)
- Le serveur stocke l'adresse IP et le port (également le nom d'utilisateur) utilisé par chaque utilisateur
Lorsque le serveur est invité à transmettre un message à un utilisateur, il l'envoie à l'adresse IP et le port stocké
J'utilise une prise pour le « Bonjour », mais je ne peux pas utiliser le même pour renvoyer des messages (à cause de comment j'ai programmé le serveur). Mais ce n'est pas le problème. Lorsque le serveur reçoit le "Hello", il écoute sur le port correspondant. Mais quand le serveur est celui qui doit démarrer la connexion, c'est l'application qui doit le faire. Pour ce faire, l'application doit savoir sur quel port elle doit écouter (elle ne sait pas à cause de NAT), et je lui dis donc de renvoyer le port utilisé via le premier socket utilisé pour le message "Hello". Malgré cela, mon application est incapable de recevoir des messages et reste dans l'appel de réception.
Ici vous avez le code:
Serveur:
DatagramSocket client = new DatagramSocket(2048); //Predefined port
DatagramPacket receivePacket;
byte[] receiveData = new byte[1024];
receivePacket = new DatagramPacket(receiveData,
receiveData.length);
System.out.println("Ready to receive");
client.receive(receivePacket);
System.out.println("Received successfuly");
String receivedPort = String.valueOf(receivePacket.getPort());
byte[] sendData = receivedPort.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, receivePacket.getAddress(), receivePacket.getPort());
client.send(sendPacket); //Send back the port used by the app
System.out.println("Sent successfuly");
client.close();
Thread.sleep(1000); //To make sure the app is ready to listen
DatagramSocket socket = new DatagramSocket();
byte[] sendData2 = "Working like a charm".getBytes();
InetAddress ip = receivePacket.getAddress();
int port = receivePacket.getPort();
System.out.println(ip + " " + port);
DatagramPacket sendPacket2 = new DatagramPacket(sendData2, sendData2.length, ip, port);
socket.send(sendPacket);
System.out.println("Sent successfuly 2nd time");
socket.close();
client (application Android):
EditText eT = (EditText) findViewById(R.id.messageText);
String message = eT.getText().toString();
DatagramSocket socket = new DatagramSocket();
byte[] sendData = message.getBytes();
InetAddress ip = InetAddress.getByName(MY_COMPUTER'S_IP);
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, 2048);
socket.send(sendPacket);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket); //Receive the port used (and that must be opened and redirecting the traffic to this device due to NAT)
socket.close();
String receivedMessage = new String(receivePacket.getData());
String receivedData = new String(receivePacket.getData());
String actualData = receivedData.substring(0, receivePacket.getLength());
Log.d("Port", actualData);
int port = Integer.parseInt(actualData);
DatagramSocket socket2 = new DatagramSocket(port);
DatagramPacket receivePacket2;
byte[] receiveData2 = new byte[1024];
receivePacket2 = new DatagramPacket(receiveData2,
receiveData2.length);
socket2.receive(receivePacket2); //Here is where it gets blocked
String data = new String(receivePacket2.getData());
Log.d("Finally received", data.substring(receivePacket2.getLength()));
socket2.close();
Quelqu'un sait-il pourquoi mes messages ne font pas en arrière à travers la deuxième prise? J'ai vérifié et l'IP et les ports sont corrects.
Merci d'avance pour votre réponse, et je m'excuse pour mon formatage.
Peut-être qu'un pare-feu bloque la communication – Luftbaum