2012-06-25 3 views
0

В настоящее время я разрабатываю связь сокетов между Android и сервером, которая представляет собой простую программу java, запущенную в терминале. Дела идут хорошо, за исключением есть предупреждение появляется всегда в LogCat, когда я закрыть приложение:Внедрение передачи и приема сокета в Android

IInputConnectionWrapper showStatusIcon on inactive InputConnection 

Я ищу в Интернете, чтобы выяснить проблему, я нашел пост в StackOverflow Similar Problem. Разница в том, что я могу хорошо отправлять и получать информацию в своей программе. Ответ на эту аналогичную проблему заключается в том, что соединение не закрыто. Означает ли это, что я не звонил socket.close(); после операции? Это приводит к более сложной проблеме реализации.

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

Подробный коды размещены ниже

Я инициализировать соединение в конструкторе, как:

client = new Socket(mServerName, mport); 
out = new DataOutputStream(client.getOutputStream()); 
inFromServer = new InputStreamReader(client.getInputStream()); 
reader = new BufferedReader(inFromServer); 

И пусть они будут там в течение всего процесса.

Я писал передачи от андроида к серверу в функцию следующим образом:

public void sendRequest(int type, int what1, int what2, Object data) 
{ 
    try{ 
     if(client.isConnected()) 
     { 
      out.writeUTF(encoded(type,what1,what2,data) + "\n");    
     } 
    }catch(IOException e){ 
     Log.e(TAG, "IOException at SendRequest"); 
     e.printStackTrace(); 
    } 
} 

Слушатель в новом потоке:

try {  
     String line = null; 
     while ((line = reader.readLine()) != null) 
     { 
      ReceiveHandler(line); 
     } 
    } catch (IOException e) { 
     Log.e(TAG, "IOException at StartListen"); 
     e.printStackTrace(); 
    }finally{ 
     try { 
     // The Only Place that I close the Socket 
      inFromServer.close(); 
      out.close(); 
      reader.close(); 
      client.close(); 
     } catch (IOException e) { 
      Log.e(TAG, "Close Socket with IOException " + e.toString()); 
      e.printStackTrace(); 
     } 
    } 

Мой вопрос:

Есть ли что-то неправильно с моей реализацией или есть ли лучшие способы сделать это?

Большое вам спасибо за помощь!

ответ

1

Существует инструмент, который может помочь вам диагностировать Networ k связанных вопросов как на устройствах Android, так и в эмуляторе. Это может помочь вам отследить проблему немного дальше. Инструмент ARO имеет открытый источник и доступен здесь http://developer.att.com/developer/forward.jsp?passedItemId=9700312

0

Я не уверен, будет ли это для вашего любого использования или нет .. но я даю вам код, я использовал для сервера клиента связи ..

стороны клиента код:

public class ClientWala { 

    public static void main(String[] args) throws Exception{ 

     Boolean b = true; 
    Socket s = new Socket("127.0.0.1", 4444); 

    System.out.println("connected: "+s.isConnected()); 


    OutputStream output = s.getOutputStream(); 
    PrintWriter pw = new PrintWriter(output,true); 

    // to write data to server 
    while(b){ 

     if (!b){ 

      System.exit(0); 
     } 

     else { 
      pw.write(new Scanner(System.in).nextLine()); 
     } 
    } 


    // to read data from server 
    InputStream input = s.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(input); 
    BufferedReader br = new BufferedReader(isr); 
    String data = null; 

    while ((data = br.readLine())!=null){ 

     // Print it using sysout, or do whatever you want with the incoming data from server 

    } 




    } 
} 

сервера код сторона:

import java.io.* 
import java.net.*; 


public class ServerTest { 

    ServerSocket s; 

    public void go() { 

     try { 
      s = new ServerSocket(44457); 

      while (true) { 

       Socket incoming = s.accept(); 
       Thread t = new Thread(new MyCon(incoming)); 
       t.start(); 
      } 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

    } 

    class MyCon implements Runnable { 

     Socket incoming; 

     public MyCon(Socket incoming) { 

      this.incoming = incoming; 
     } 

     @Override 
     public void run() { 

      try { 
       PrintWriter pw = new PrintWriter(incoming.getOutputStream(), 
         true); 
       InputStreamReader isr = new InputStreamReader(
         incoming.getInputStream()); 
       BufferedReader br = new BufferedReader(isr); 
       String inp = null; 

       boolean isDone = true; 

       System.out.println("TYPE : BYE"); 
       System.out.println(); 
       while (isDone && ((inp = br.readLine()) != null)) { 

        System.out.println(inp); 
        if (inp.trim().equals("BYE")) { 
         System.out 
           .println("THANKS FOR CONNECTING...Bye for now"); 
         isDone = false; 
         s.close(); 
        } 

       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       try { 
        s.close(); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       e.printStackTrace(); 
      } 

     } 

    } 

    public static void main(String[] args) { 

     new ServerTest().go(); 

    } 

} 
+0

Большое спасибо за вашу помощь! Но в вашей программе вы отправляете информацию, слушая консоль. Я хочу, чтобы я мог вызывать функцию отправки сообщения из других классов. У вас есть идеи об этом? Все же разрешите поблагодарить вас! – Fei