2015-04-12 90 views
0

我正在開發一個遠程控制應用程序來控制我最初編寫的使用遠程索尼API的所有設備(電視,媒體中心等),這些API工作得很好,但現在我想嘗試控制設備通過我的網絡。使用Android接收tcp消息

我已經完成了使用SOAP請求的電視,現在我正在做我的媒體中心,這是一臺PC。 我的問題是我可以發送一個媒體中心正確響應的命令(我可以看到使用Wireshark返回的響應)。正在發送的命令在變量str和str1中。

我對編程Android很陌生,對IP知之甚少,所以我想知道是否有人能指引我朝着正確的方向發展。

我正在使用API​​ 19(我是唯一一個使用該應用程序的),目前它會在發送我的TCP命令後立即崩潰。我懷疑我正在做一些愚蠢的事情。我的代碼如下: -

public class MainActivity extends Activity 
{ 
String success; 
Button btnok; 
TextView txtvwdata1; 

MyTask objMyTask; 

private Socket socket; 
public Void result; 

private static final int SERVERPORT = 8017; 
private static final String URL = "192.168.1.95"; 


@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnok = (Button)findViewById(R.id.btnok); 
    txtvwdata1 = (TextView)findViewById(R.id.txtvwdata1); 

    new Thread(new ClientThread()).start(); 

    btnok.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      objMyTask = new MyTask(); 
      objMyTask.execute(); 
     } 
    }); 
} 

class ClientThread implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     try 
     { 
      InetAddress serverAddr = InetAddress.getByName(URL); 
      socket = new Socket(serverAddr, SERVERPORT); 
     } catch (UnknownHostException e1) 
     { 
      e1.printStackTrace(); 
     } 
     catch (IOException e1) 
     { 
      e1.printStackTrace(); 
     } 
    } 
} 

class MyTask extends AsyncTask<Void, Void, String> 
{ 
    @Override 
    protected String doInBackground(Void... params) 
    { 
     try 
     { 
      String str = "\r\n{\"Type\":\"identify\",\"AppName\":null,\"Authenticate\":{\"AuthMethod\":\"userpass\",\"Password\":\"admin\",\"User\":\"admin\"},\"Description\":\"Android client for MediaPortal\",\"Name\":\"Steve\",\"Version\":\"1.0\"}\r\n"; 
      String str1 = "\r\n{\"Type\":\"playchannel\",\"ChannelId\":1315,\"StartFullscreen\":true}\r\n"; 

      PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), 
        true); 
      out.println(str); 
      delay(); 
      out.println(str1); 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     //Get Response  
     InputStream is = null; 
     // is= connection.getInputStream(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     StringBuffer response = new StringBuffer(); 
     try { 
      while((line = rd.readLine()) != null) 
      { 
       response.append(line); 
       response.append('\r'); 
      } 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     try { 
      rd.close(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     Log.i("response", "" + response.toString()); 
     return response.toString(); 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
    } 

    protected String onPostExecute() 
    { 
     return null; 
    } 
} 

public void delay() 
{ 
    int i = 0; 
    while(i < 100000) 
    { 
     i++; 
    } 
} 
} 
+1

如果應用程序崩潰,你會得到在logcat的詳細信息。請在此處張貼相關部分。看看你的代碼,你應該不會繼續,如果有一個catch,但結束方法/功能。 – greenapps

+0

'專用套接字套接字;'。切換到'private Socket socket = null;'。在onClick檢查socket == null。如果它是空的,則顯示Toast這樣說,不要啓動AsyncTask。你在哪裏運行?仿真器/手機/設備?所以它連接?只有當用戶按下按鈕時,你有一個崩潰? – greenapps

+0

'response.append('\ r');'。切換到'response.append(「\ n」);' – greenapps

回答

0

非常感謝您的所有幫助greenapps,這已經解決了我的問題。在做出更改後,您現在建議不要崩潰並獲得響應。

private Socket socket=null; 
is = socket.getInputStream(); 
response.append("\n"); 

這是我現在的代碼: -

public class MainActivity extends Activity 
{ 


String success; 
Button btnok; 
TextView txtvwdata1; 

MyTask objMyTask; 

public String result; 

private Socket socket=null; 

private static final int SERVERPORT = 8017; 
private static final String URL = "192.168.1.95"; 


@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnok = (Button)findViewById(R.id.btnok); 
    txtvwdata1 = (TextView)findViewById(R.id.txtvwdata1); 

    new Thread(new ClientThread()).start(); 

    btnok.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      objMyTask = new MyTask(); 
      objMyTask.execute(); 
      txtvwdata1.setText(result); 
     } 
    }); 
} 

class ClientThread implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     try 
     { 
      InetAddress serverAddr = InetAddress.getByName(URL); 
      socket = new Socket(serverAddr, SERVERPORT); 
     } catch (UnknownHostException e1) 
     { 
      e1.printStackTrace(); 
     } 
     catch (IOException e1) 
     { 
      e1.printStackTrace(); 
     } 
    } 
} 

class MyTask extends AsyncTask<Void, Void, String> 
{ 
    @Override 
    protected String doInBackground(Void... params) 
    { 
     try 
     { 
      String str = "\r\n{\"Type\":\"identify\",\"AppName\":null,\"Authenticate\":{\"AuthMethod\":\"userpass\",\"Password\":\"admin\",\"User\":\"admin\"},\"Description\":\"Android client for MediaPortal\",\"Name\":\"aMPdroid\",\"Version\":\"1.1.3\"}\r\n"; 
      String str1 = "\r\n{\"Type\":\"playchannel\",\"ChannelId\":1315,\"StartFullscreen\":true}\r\n"; 

      PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), 
        true); 
      out.println(str); 
      out.println(str1); 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     //Get Response  
     try 
     { 
      InputStream is= socket.getInputStream(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
      String line; 
      StringBuffer response = new StringBuffer(); 
      try { 
       int a = 1; 
       while((line = rd.readLine()) != null) 
       { 
        response.append(line); 
        response.append("\r\n"); 
        Log.i("response", "" + response.toString()); 
        if (a == 1) 
        { 
         break; 
        } 
        a++; 
       } 
       result = response.toString(); 
       return response.toString(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      try { 
       rd.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     try 
     { 
      socket.close(); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
    } 

    protected String onPostExecute() 
    { 
     return null; 
    } 
} 

}

+0

請勿以這種方式自己發佈答案。如果你自己沒有找到答案,留下他人的答案。你可以在評論中告訴我,我的建議奏效了。 – greenapps

+0

我不會完全同意那裏的綠化 - 一張海報可以自由地陳述什麼工作,特別是如果他們迄今爲止所給的都是暗示。但是這並不重要,因爲無論如何這都不是一個可行的答案 - 當它試圖調用剛剛無效的套接字上的getInputStream()時,這裏發佈的代碼顯然會與空指針異常一起崩潰。 –

+0

對不起,正如我在完成答案時提到的那樣,greenapps的建議確實解決了我的問題。它沒有工作,因爲服務器繼續發送數據,所以被卡在while循環中,一旦我理解了mediaport上的遠程插件如何工作,我就可以解決,否則我現在正在接收我現在可以處理的數據。感謝您的幫助,非常感謝。 – user3402009