¿Cómo hacer que el cliente en Android escuche al servidor en C #?

Tengo un cliente en Android y un servidor en c #. El cliente envía mensajes al servidor y está bien. Pero necesito que el servidor envíe a pedido una lista de carpetas y archivos en un directorio específico y no sé cómo hacerlo, porque el cliente no recibe ningún mensaje del servidor. La parte del código del cliente que está destinada a escuchar no funciona, la aplicación simplemente se atasca hasta que cierre la aplicación del servidor, luego vuelve a funcionar, pero aún no lee nada. Gracias por adelantado

Cliente:

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(); } } } 

Servidor:

 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, encontré la solución a tu problema.

En su servidor c # donde envía el texto:

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

Asegúrese de cerrar el zócalo aquí una vez que envíe los datos. Es por eso que tu aplicación se cuelga. IT estaba esperando más entrada del servidor

Además, cambie a esto en Java donde recibe

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

Observe cómo está haciendo 2 readInputs en ese bucle. La instrucción while hace uno … y la configuración del texto hace uno … así que esencialmente estás tratando de leer 2 líneas durante un bucle. Cambiar a lo que publiqué arriba arreglará eso

Para evitar la excepción NetworkOnMainThreadException, debe ejecutar el código de comunicación en un nuevo hilo.

En el cliente de Android:

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

Gracias por su código de ejemplo!

Sólo por información:

necesita que se establezca el siguiente permiso: