Pourquoi mon datagramme client / serveur UDP n’utilise-t-il pas la communication bidirectionnelle?

J’ai configuré un datagramme client / serveur UDP simple entre deux applications: Android-Java-Client et Windows-C #-Server. Ceci est ma toute première programmation Java et applications Android, la solution est donc évidente. J’ai donc réussi à envoyer un paquet du client au serveur. Cependant, je ne pouvais pas renvoyer du serveur au client.

J’essaie d’envoyer un message de confirmation du serveur au client. J’ai essayé de fusionner le code de client C # avec le code de serveur C # existant, mais il se bloquait une fois que le serveur avait reçu son premier message, System.ObjectDisposedException . J’ai supprimé et recommencé à nouveau “Voir édité si vous voulez”. Maintenant, j’envoie avec succès au serveur, mais rien n’est reçu et rien ne s’affiche sur le côté client Java. Je sais que je peux (ou devrais peut-être) utiliser le même socket pour le renvoyer au client. Où est mon erreur? S’il vous plaît et merci.

  • J’ai essayé de mettre tout le NetworkThread dans le OnTouchListener
  • J’ai essayé de décomposer SendUdpMessage() en deux, un pour envoyer et un pour recevoir
  • J’ai essayé la réponse ci-dessous

Et je ne peux toujours pas le faire fonctionner 🙁

Côté serveur C #:

 // This class is responsible of running the server side on the PC. class UdpServer { static void Main(ssortingng[] args) { byte[] data = new byte[1024]; UdpClient serverSocket = new UdpClient(15000); int i = 0; while (true) { Console.WriteLine("Waiting for a UDP client..."); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); data = serverSocket.Receive(ref sender); ssortingng ssortingngData = Encoding.ASCII.GetSsortingng(data, 0, data.Length); Console.WriteLine("Response from " + sender.Address); Console.WriteLine("Message " + i++ + ": " + ssortingngData + "\n"); // Here I am sending back byte[] data2 = Encoding.ASCII.GetBytes("Response"); serverSocket.Send(data2, 8, sender); } } } 

Côté client Java: un bouton appelle une fonction pour envoyer un message UDP et atsortingbuer la réponse à une variable globale que j’essaie ensuite d’afficher à l’écran via une zone de texte.

  public class MainActivity extends AppCompatActivity { Ssortingng message; Ssortingng Response; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Button Declaration final TextView TextOne = (TextView) findViewById(R.id.StatusText); Button LftBtn = (Button) findViewById(R.id.LeftButton); // ... // other code here (button declaration and event handlers // ... // Left Button Click LftBtn.setOnTouchListener( new Button.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { //Button pressed TextOne.setText("Left"); message = "Left"; SendUdpMsg(message); TextOne.setText(Response); return true; } else if (event.getAction() == MotionEvent.ACTION_UP) { //Button released do nothing return true; } return false; }//onTouch });//setOnTouchListener } // This function is responsible for sending a udp packet to a hardCoded IP below. Returns nothing and takes a ssortingng(the message) as a parameter. public void SendUdpMsg(final Ssortingng msg) { Thread networkThread = new Thread() { // No local Host 127.0.0.1 in Android Ssortingng host = "192.168.200.3"; // my actual IP int port = 15000; DatagramSocket dsocket = null; Ssortingng Response = "1"; public void run() { try { // Get the Internet address of the specified host InetAddress address = InetAddress.getByName(host); // wrap a packet DatagramPacket packet = new DatagramPacket( msg.getBytes(), msg.length(), address, port); // Create a datagram socket, send the packet through it, close it. dsocket = new DatagramSocket(); dsocket.send(packet); // Here, I am receiving the response? byte[] buffer = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(buffer, buffer.length); dsocket.receive(packet2); Response = new Ssortingng(buffer, 0, packet2.getLength()); runOnUiThread(new Runnable() { @Override public void run() { // I can't use this since TextOne is a local variable in the above function //TextOne.setText(Response); } }); dsocket.close(); } catch (Exception e) { e.printStackTrace(); }//catch }//run };// Networkthread networkThread.start();//networkThread.start() } } 

Le code de réseau fonctionne, le problème est que vous n’attendez pas la réponse, c’est-à-dire que la méthode SendUdpMsg ne peut pas renvoyer la réponse immédiatement, elle doit être poussée par le fil d’arrière-plan. Par exemple :

 dsocket.receive(packet2); Response = new Ssortingng(buffer, 0, packet2.getLength()); // we received the response // but since we are running on a background thread, we can not touch the UI runOnUiThread(new Runnable() { @Override public void run() { // this is executed on the main (UI) thread TextOne.setText(Response); } }); dsocket.close(); 

Devoir travailler sur un thread d’arrière-plan et gérer les résultats sur le thread principal est un modèle courant. Android fournit quelques outils comme Handler ou AsyncTask

J’ai donc ajouté ceci dans mon SendUdpMsg() :

 runOnUiThread(new Runnable() { @Override public void run() { final TextView TextOne = (TextView) findViewById(R.id.StatusText); TextOne.setText(Response); } });` 

Et finalement ça a marché! Cliquez sur le bouton I pour envoyer le message et recevoir la Response .

Mission: Je veux cliquer sur mon mobile pour commencer à diffuser de la vidéo en direct à partir de la webcam de l’ordinateur portable et l’afficher sur l’écran de mon mobile.

Demande: Est-ce que mon approche de cette communication bidirectionnelle est bonne? Si non, quel est le meilleur?