使用Android接收tcp消息
我正在开发一个远程控制应用程序来控制我的所有设备(电视、媒体中心等)。我最初编写这个应用程序是为了使用远程索尼API,它工作得很好,但现在我想尝试通过我的网络控制设备 我已经完成了使用SOAP请求的电视,现在我正在做我的媒体中心,它是一台PC。 我的问题是,我可以发送媒体中心正确响应的命令(我可以看到使用Wireshark返回的响应)。正在发送的命令在变量str和str1中 我对Android编程很陌生,对IP知之甚少,所以我想知道是否有人能给我指出正确的方向 我正在使用API 19(我是唯一一个使用该应用程序的人),目前它将在发送TCP命令后崩溃。我怀疑我在做傻事。我的代码如下:-使用Android接收tcp消息,android,tcp,Android,Tcp,我正在开发一个远程控制应用程序来控制我的所有设备(电视、媒体中心等)。我最初编写这个应用程序是为了使用远程索尼API,它工作得很好,但现在我想尝试通过我的网络控制设备 我已经完成了使用SOAP请求的电视,现在我正在做我的媒体中心,它是一台PC。 我的问题是,我可以发送媒体中心正确响应的命令(我可以看到使用Wireshark返回的响应)。正在发送的命令在变量str和str1中 我对Android编程很陌生,对IP知之甚少,所以我想知道是否有人能给我指出正确的方向 我正在使用API 19(我是唯一一
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++;
}
}
}
公共类MainActivity扩展活动
{
串成功;
按钮btnok;
text视图txtvwdata1;
MyTask-objMyTask;
专用插座;
公开无效结果;
专用静态最终int服务器端口=8017;
私有静态最终字符串URL=“192.168.1.95”;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnok=(按钮)findviewbyd(R.id.btnok);
txtvwdata1=(TextView)findViewById(R.id.txtvwdata1);
新线程(新ClientThread()).start();
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
objMyTask=newmytask();
objMyTask.execute();
}
});
}
类ClientThread实现Runnable
{
@凌驾
公开募捐
{
尝试
{
inetAddressServerAddr=InetAddress.getByName(URL);
套接字=新套接字(serverAddr、SERVERPORT);
}捕获(未知后异常e1)
{
e1.printStackTrace();
}
捕获(IOE1异常)
{
e1.printStackTrace();
}
}
}
类MyTask扩展了AsyncTask
{
@凌驾
受保护字符串doInBackground(无效…参数)
{
尝试
{
String str=“\r\n{”Type\”:\“identification\”,\“AppName\”:null,\“Authenticate\”:{\“AuthMethod\”:“userpass\”,“Password\”:“admin\”,“User\”:“admin\”,“Description\”:“MediaPortal的Android客户端\”,“Name\:“Steve\”,“Version\”:“1.0\”}\r\n”;
String str1=“\r\n{”Type\”:\“playchannel\”,\“ChannelId\”:1315,\“StartFullscreen\”:true}\r\n”;
PrintWriter out=新的PrintWriter(新的BufferedWriter(
新的OutputStreamWriter(socket.getOutputStream()),
正确的);
out.println(str);
延迟();
out.println(str1);
}
捕获(未知后异常e)
{
e、 printStackTrace();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
捕获(例外e)
{
e、 printStackTrace();
}
//得到回应
InputStream=null;
//is=connection.getInputStream();
BufferedReader rd=新的BufferedReader(新的InputStreamReader(is));
弦线;
StringBuffer响应=新的StringBuffer();
试一试{
而((line=rd.readLine())!=null)
{
响应。追加(行);
append('\r');
}
}
捕获(IOE异常)
{
e、 printStackTrace();
}
试一试{
rd.close();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
Log.i(“response”,“”+response.toString());
返回response.toString();
}
@凌驾
受保护的void onPreExecute()
{
super.onPreExecute();
}
受保护的字符串onPostExecute()
{
返回null;
}
}
公共无效延迟()
{
int i=0;
而(i<100000)
{
i++;
}
}
}
非常感谢您的帮助,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;
}
}
公共类MainActivity扩展活动
{
串成功;
按钮btnok;
text视图txtvwdata1;
MyTask-objMyTask;
公共字符串结果;
私有套接字=空;
专用静态最终int服务器端口=8017;
私有静态最终字符串URL=“192.168.1.95”;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnok=(按钮)findviewbyd(R.id.btnok);
txtvwdata1=(TextView)findViewById(R.id.txtvwdata1);
新线程(新ClientThread()).start();
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
objMyTask=newmytask();
objMyTask.execute();
txtvwdata1.setText(结果);
}
});
}
类ClientThread实现Runnable
{
@凌驾
公开募捐
{
尝试
{
inetAddressServerAddr=InetAddress.getByName(URL);
套接字=新套接字(serverAddr、SERVERPORT);
}捕获(未知后异常e1)
{
e1.printStackTrace();
}
捕获(IOE1异常)
{
e1.printStackTrace();
}
}
}
类MyTask扩展了AsyncTask
{
@凌驾
受保护字符串doInBackground(无效…参数)
{
尝试
{
String str=“\r\n{Type\”:“Identification\”,“AppName\”:null,“Authenticate\”:{“AuthMethod\”:“userpass\”,“Password\”:“admin\”,“User\”:“admin\”,“Description\”:“Android客户端for MediaPortal\”,“Name\:“aMPdroid\”,“Version\”:“1.1.3\”}\r\n”;
String str1=“\r\n{”Type\”:\“playchannel\”,\“ChannelId\”:1315,\“StartFullscreen\”:true}\r\n”;