Wie lässt sich der Client auf Android Server auf C # hören?

Ich habe einen Client auf Android und Server auf c #. Der Client sendet Nachrichten an den Server und es ist in Ordnung. Ich benötige jedoch einen Server, um auf Anfrage eine Liste von Ordnern und Dateien im angegebenen Verzeichnis zu senden, und ich weiß nicht, wie das geht, da der Client keine Nachrichten vom Server erhält. Der Teil des Codes des Clients, der abgehört werden soll, funktioniert nicht. Die Anwendung bleibt einfach stecken, bis ich die Serveranwendung schließe. Danach funktioniert sie wieder, liest jedoch nichts. Danke im Voraus

Klient:

package com.app.client.app; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import android.util.Log; public class my_activity extends Activity { private TextView txt; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button)findViewById(R.id.button1); txt = (TextView)findViewById(R.id.textView1); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub connectSocket("Hello"); } }); } private void connectSocket(String a){ try { InetAddress serverAddr = InetAddress.getByName("192.168.1.2"); Log.d("TCP", "C: Connecting..."); Socket socket = new Socket(serverAddr, 4444); message = "1"; PrintWriter out = null; BufferedReader in = null; try { Log.d("TCP", "C: Sending: '" + message + "'"); out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.println(message); while ((in.readLine()) != null) { txt.append(in.readLine()); } Log.d("TCP", "C: Sent."); Log.d("TCP", "C: Done."); } catch(Exception e) { Log.e("TCP", "S: Error", e); } finally { socket.close(); } } catch (UnknownHostException e) { // TODO Auto-generated catch block Log.e("TCP", "C: UnknownHostException", e); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block Log.e("TCP", "C: IOException", e); e.printStackTrace(); } } } 

Server:

 using System; using System.Text; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Windows.Forms; public class serv { public static void Main() { try { IPAddress ipAd = IPAddress.Parse("192.168.1.2"); // use local m/c IP address, and // use the same in the client /* Initializes the Listener */ TcpListener myList=new TcpListener(ipAd,4444); /* Start Listeneting at the specified port */ myList.Start(); Console.WriteLine("The server is running at port 4444..."); Console.WriteLine("The local End point is :" + myList.LocalEndpoint ); Console.WriteLine("Waiting for a connection....."); m: Socket s=myList.AcceptSocket(); Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); byte[] b=new byte[100]; int k=s.Receive(b); char cc = ' '; string test = null; Console.WriteLine("Recieved..."); for (int i = 0; i < k-1; i++) { Console.Write(Convert.ToChar(b[i])); cc = Convert.ToChar(b[i]); test += cc.ToString(); } switch (test) { case "1": break; } ASCIIEncoding asen=new ASCIIEncoding(); s.Send(asen.GetBytes("The string was recieved by the server.")); Console.WriteLine("\nSent Acknowledgement"); /* clean up */ goto m; s.Close(); myList.Stop(); Console.ReadLine(); } catch (Exception e) { Console.WriteLine("Error..... " + e.StackTrace); } } } 

Ok, ich habe die Lösung für Ihr Problem gefunden.

In Ihrem c # -Server, an den Sie den Text senden:

 ASCIIEncoding asen = new ASCIIEncoding(); s.Send(asen.GetBytes("The string was recieved by the server.")); s.Close(); 

Stellen Sie sicher, dass Sie den Socket hier schließen, nachdem Sie die Daten gesendet haben. Deshalb würde Ihre App hängen. Die IT-Abteilung wartete auf weitere Eingaben vom Server

Wechseln Sie auch dort in Java, wo Sie empfangen werden

 String text = ""; String finalText = ""; while ((text = in.readLine()) != null) { finalText += text; } txt.setText(finalText); 

Beachten Sie, wie Sie 2 readInputs in dieser Schleife ausführen. Die while-statement macht eine .. und das Setzen des Textes macht eine .. Daher versuchen Sie im Wesentlichen, 2 Zeilen in einer Schleife zu lesen. Das zu ändern, was ich oben gepostet habe, wird das beheben

Um NetworkOnMainThreadException zu vermeiden, müssen Sie den Kommunikationscode in einem neuen Thread ausführen.

Im Android-Client:

  @Override public void onClick(View v) { new Thread(new Runnable() { public void run() { connectSocket("Hello"); } }).start(); } 

Vielen Dank für Ihr Codebeispiel!

Nur zur Info:

Sie benötigen folgende Berechtigung: