2012-05-23 4 views
0

Я только что получил быстрый вопрос. Я пытаюсь создать приложение, которое может связываться с сервером, отправив пакеты TCP, а затем сервер отправит пакет TCP обратно или на другое устройство. Но как я могу сделать услугу, когда при получении пакета TCP на устройстве было сделано уведомление?android отправлять и получать TCP-пакет

Я пробовал это;

extends Service { 
Thread henk; 

private static final String TAG = "Service"; 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 
    henk = new Thread(new Runnable(){ 

     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       Boolean end = false; 
       ServerSocket ss = new ServerSocket(1337); 
       while(!end){ 
         //Server is waiting for client here, if needed 
         Socket s = ss.accept(); 
         BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 

         String st = input.readLine(); 
         Log.d("Tcp Example", "From client: "+st); 

         s.close(); 

       } 
     ss.close(); 


     } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } 
     } 



    }); 


} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 

} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 

    henk.run(); 

} 

Но это просто разрушает мое приложение. Помогите, пожалуйста?

Stack Следы:

E/ActivityManager( 240): ANR in tictactoe.elqauto 
E/ActivityManager( 240): Reason: Executing service tictactoe.elqauto/.servicere 
cieve 
E/ActivityManager( 240): Load: 7.09/7.29/7.5 
E/ActivityManager( 240): CPU usage from 9411ms to 3791ms ago: 
E/ActivityManager( 240): 1.2% 3857/de.devmil.minimaltext: 1.1% user + 0.1% ke 
rnel/faults: 191 minor 
E/ActivityManager( 240): 2.5% 240/system_server: 1.9% user + 0.5% kernel/fa 
ults: 20 minor 
E/ActivityManager( 240): 0.1% 4797/tiwlan_wq: 0% user + 0.1% kernel 
E/ActivityManager( 240): 0% 16322/org.adwfreak.launcher: 0% user + 0% kernel 
/faults: 226 minor 1 major 
E/ActivityManager( 240): 0% 19108/com.aricent.mtp: 0% user + 0% kernel/faul 
ts: 16 minor 
E/ActivityManager( 240): 0% 30600/com.google.process.gapps: 0% user + 0% kern 
el/faults: 20 minor 5 major 
E/ActivityManager( 240): 11% TOTAL: 8% user + 3% kernel + 0.1% iowait 
E/ActivityManager( 240): CPU usage from 368ms to 884ms later: 
E/ActivityManager( 240): 5.6% 240/system_server: 1.8% user + 3.7% kernel/fa 
ults: 15 minor 
E/ActivityManager( 240):  5.6% 266/ActivityManager: 1.8% user + 3.7% kernel 
E/ActivityManager( 240): 44% TOTAL: 1.9% user + 1.9% kernel + 40% iowait 

Резюме:

Так что я пытаюсь сделать, это отправить пакет TCP с именем на сервер сервер получит IP-адрес, который принадлежит с это имя из базы данных и отправить ему пакет TCP с некоторой информацией. Поскольку я не нашел решение, я попробовал сокеты, но теперь я застрял в принимающей части.

+0

Я сделал это –

+0

Вы использовали logcat? Если это возможно, отправьте трассировку стека из логкатата при сбое приложения: 'adb logcat -s *: E' должен сделать это в командной строке. Я предполагаю, что есть попытка обновить пользовательский интерфейс, а не поток пользовательского интерфейса, но вывод о сбое будет точно. – jarvisteve

+0

@jarvisteve Написал трассировку стека в '/data/anr/traces.txt' Но я не могу найти этот файл? –

ответ

1

Не имеет смысла запускать TCP-сервер на устройстве Android, так как вы обычно не знаете его адрес.

Альтернативное решение заключается в том, чтобы поддерживать соединение клиента с сервером, а затем возвращать пакеты обратно к тем устройствам, которые должны получать пакет.

Более эффективное решение для батареи - использовать C2DM от Google. Однако для этого требуется, чтобы устройства вошли в систему с учетной записью Google.

+0

Ну, я отправляю свой IP-адрес при изменении базы данных, и сервер получает имя, которое я хочу отправить с помощью ip, и отправляет пакет на это устройство, но он должен быть возвращен, может ли C2DM это сделать? –

+0

Что произойдет, если получатель находится в автономном режиме? Должна ли передача сбой или пакет должен прибыть в конце концов, когда получатель подключится к сети? C2DM предназначен для решения последнего случая, но может также использоваться для реализации первого, если задержка является проблемой. Вы должны были бы описать свой сценарий связи более подробно, чтобы я мог больше прокомментировать это. – werk

+0

Когда он вернется в интернет, он получит его, и то, что им тоже пытается. подождите, я отредактирую его –

Смежные вопросы