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:
- Androide, socket, programación, atrás, router
- Pérdida severa de paquetes UDP en algunos dispositivos Android
- ¿El zócalo del cliente androide, cómo leer datos?
- Socket para servidor Android
- DatagramSocket.bind (); Socket excepción: no se puede asignar la dirección solicitada. Emulador de Android
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.
- Tiempo de espera de conexión de socket Android
- HTTP Vs sockets Vanilla para cargar archivos binarios grandes (50-200 MB) desde un dispositivo Android a través de una red Wi-Fi de un solo salto
- ¿Cómo puede mi aplicación Android comunicarse con un daemon nativo?
- Cómo enviar el archivo binario y el texto usando el mismo socket
- Envío de datos TCP desde Android (como cliente) - ¿no se envían datos?
- Comunicación entre dos aplicaciones usando emulador como servidor y cliente
- Audio de la corriente del androide al servidor
- Mensajes de error NetlinkListener y NetlinkEvent
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
- Reconocimiento de voz activado por palabra clave en android
- ¿Cómo puedo enlazar la biblioteca nativa en Android Studio?