我正在開發一個遠程控制應用程序來控制我最初編寫的使用遠程索尼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++;
}
}
}
如果應用程序崩潰,你會得到在logcat的詳細信息。請在此處張貼相關部分。看看你的代碼,你應該不會繼續,如果有一個catch,但結束方法/功能。 – greenapps
'專用套接字套接字;'。切換到'private Socket socket = null;'。在onClick檢查socket == null。如果它是空的,則顯示Toast這樣說,不要啓動AsyncTask。你在哪裏運行?仿真器/手機/設備?所以它連接?只有當用戶按下按鈕時,你有一個崩潰? – greenapps
'response.append('\ r');'。切換到'response.append(「\ n」);' – greenapps