Hola!
Muchas gracias Misato por tu codigo, me he hecho otro proyecto en eclipse con tu handler y estoy tirando por ahí, la verdad es que la logica del codigo es la misma y me basta con darle a run
El caso es que tambien tengo que hacer el lado del servidor en linux y ambas partes no acaban de entenderse. Parece como que el socket se queda abierto, sin terminar de enviar, por lo que ni uno acaba de enviar ni el otro de recibir.
He realizado pruebas por separado:
- Server: mi codigo C en linux -> Cliente:socket workbench y funciona OK
- Server: nc desde consola linux -> Cliente: mi app android y funciona OK
- Server: socket workbench -> Cliente: mi app android y NO funciona
- Server: mi codigo C en linux -> Cliente: mi app android y NO funciona
La app android envia el primer comando, y el servidor lo recibe en cualquiera de mis pruebas. Despues el servidor envia la respuesta, pero no llega a la app android, que se queda indefinidamente en el readline(). Si cierro el servidor justo despues de esto, parece como que se libera el socket y la app si que acaba recibiendo la respuesta del servidor.
El problema es que no sé que cambiar, si ambas partes funcionan por separado.
Os pego el codigo de cada cosa para que me ayudéis si podeis.
Server:
Código:
if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
//print the error message
perror("bind failed. Error");
return 1;
}
puts("bind done");
//Listen
listen(socket_desc , 3);
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
//accept connection from an incoming client
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
if (client_sock < 0)
{
perror("accept failed");
return 1;
}
puts("Connection accepted");
//Receive a message from client
while( kbhit()==0 && (read_size = recv(client_sock , client_message , 2000 , 0)) > 0 )
{
//Send the message back to client
//write(client_sock , client_message , strlen(client_message));
if(memcmp(client_message,"HELO",4)==0) {
printf("Respondo ACK\n");
lng=5;
memcpy(client_message,"ACK/r",lng);
}
else if(memcmp(client_message,"INIT",4)==0) {
printf("Respondo con la info\n");
lng=39;
memcpy(client_message,"INIT:1:00001:001:01:0001:0030:00200:0\n",lng);
}
if(kbhit()!=0) {
puts("Cerrando socket");
lng=6;
memcpy(client_message,"QUIT/r",lng);
read_size=0;
}
write(client_sock , client_message , lng);
}
if(read_size == 0 || kbhit()!=0)
{
puts("Client disconnected");
fflush(stdout);
}
else if(read_size == -1)
{
perror("recv failed");
}
return 0;
Y el cliente android:
Código:
while (socket.isConnected()){
String reply = "";
if (input.ready()) {
reply = input.readline();
Log.d(HMI.LOG_TAG,"[SERVER]"+ reply);
if(lastMsgSent.equals("HELO") && reply.startsWith("ACK", 0) == false)
sendCommand(lastMsgSent+EOF); //Volvemos a intentar conexion
else if (reply.startsWith("ACK")){
//El servidor nos esta escuchando
lastMsgSent = "INIT";
sendCommand(lastMsgSent+EOF); //Pedimos datos servicio
}
else {
sendMessageToHandler(reply); //Pasamos el mensaje recibido al manejador
}
}
}
Marcadores