Conexión entre Python Server y la aplicación Android

Esta es mi primera pregunta. He buscado soluciones de problemas similares, pero en cada caso hubo algunas diferencias en comparación con mi caso. Estoy tratando de establecer una conexión sencilla entre un servidor Python y una aplicación de Android utilizando sockets. La aplicación de Android inicia una conversación con el servidor: envía un mensaje al servidor, el servidor lo recibe y lo muestra y, a continuación, el servidor envía una respuesta a la aplicación. La aplicación muestra la respuesta en la pantalla en un TextView. Este es mi código en el lado del cliente:

public class MyClient extends Activity implements OnClickListener{ EditText enterMessage; Button sendbutton; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.myclient); enterMessage = (EditText)findViewById(R.id.enterMessage); sendbutton = (Button)findViewById(R.id.sendbutton); sendbutton.setOnClickListener(this); } @Override public void onClick(View arg0) { Thread t = new Thread(){ @Override public void run() { try { Socket s = new Socket("192.168.183.1", 7000); DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(enterMessage.getText().toString()); //read input stream DataInputStream dis2 = new DataInputStream(s.getInputStream()); InputStreamReader disR2 = new InputStreamReader(dis2); BufferedReader br = new BufferedReader(disR2);//create a BufferReader object for input //print the input to the application screen final TextView receivedMsg = (TextView) findViewById(R.id.textView2); receivedMsg.setText(br.toString()); dis2.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } } }; t.start(); Toast.makeText(this, "The message has been sent", Toast.LENGTH_SHORT).show(); } } 

Y en el lado del servidor este es mi código:

 from socket import * HOST = "192.168.183.1" #local host PORT = 7000 #open port 7000 for connection s = socket(AF_INET, SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) #how many connections can it receive at one time conn, addr = s.accept() #accept the connection print "Connected by: " , addr #print the address of the person connected while True: data = conn.recv(1024) #how many bytes of data will the server receive print "Received: ", repr(data) reply = raw_input("Reply: ") #server's reply to the client conn.sendall(reply) conn.close() 

Cuando intento enviar un mensaje de la aplicación al servidor funciona perfectamente. Sin embargo, tan pronto como el servidor recibe el mensaje y lo muestra, la aplicación se detiene inmediatamente con el mensaje de error: se ha detenido inesperadamente. Vuelve a intentarlo. Información adicional: Estoy usando adt-bundle para el desarrollo de Android y IDLE para ejecutar el código del servidor. Ambos en Windows8.

Por lo que entiendo, usas un hilo para llamar al servidor pero en el mismo hilo intentas publicar resultados en la interfaz de usuario.

Final TextView receivedMsg = (TextView) findViewById (R.id.textView2); ReceivedMsg.setText (br.toString ());

Si utilizas tu propio hilo de Java, debes manejar los siguientes requisitos en tu propio código: Sincronización con el hilo principal si devuelves los resultados a la interfaz de usuario. No veo que usted está haciendo esto. Usted tiene que utilizar un manejador o quizás usted debe considerar el usar del Asynctask de androide. Con el AsyncTAsk puede escribir en la interfaz de usuario después de que se desencadene este método. OnPostExecute (Result) Se invoca en el subproceso de interfaz de usuario después de que finaliza el cálculo de fondo.

Así que dentro de este método se puede escribir en la interfaz de usuario. Echa un vistazo a estos enlaces http://learningdot.diandian.com/post/2014-01-02/40060635109 Asynctask vs hilo en android

Está escribiendo en un objeto GUI en un subproceso no gui. Es necesario utilizar un controlador para pasar el mensaje de nuevo al hilo GUI.

Vea aquí un ejemplo bastante sencillo: Actualizar la interfaz de usuario a través de Handler

  • ¿Cómo puedo cerrar BluetoothSocket en la rotación de la pantalla en Android?
  • Android juego multi-jugador a través de la red
  • Android VpnService - ¿Cómo reenviar el tráfico interceptado de Internet?
  • Socket Android excepción "socket está cerrado"
  • Aplicación de chat: qué tecnología es mejor para implementar aplicación de chat en Android
  • ¿Cómo ejecutar el servicio no en el hilo principal?
  • ObjectInputStream - ¿Cómo esperar a nuevos datos?
  • Proteger un socket en VpnService
  • ¿Cómo asociar la intención de conectividad a socket?
  • AsyncTask, doInBackground nunca se ejecuta en android
  • Recibe UDP en Android Marshmallow
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.