使用Android接收tcp消息

使用Android接收tcp消息,android,tcp,Android,Tcp,我正在开发一个远程控制应用程序来控制我的所有设备(电视、媒体中心等)。我最初编写这个应用程序是为了使用远程索尼API,它工作得很好,但现在我想尝试通过我的网络控制设备 我已经完成了使用SOAP请求的电视,现在我正在做我的媒体中心,它是一台PC。 我的问题是,我可以发送媒体中心正确响应的命令(我可以看到使用Wireshark返回的响应)。正在发送的命令在变量str和str1中 我对Android编程很陌生,对IP知之甚少,所以我想知道是否有人能给我指出正确的方向 我正在使用API 19(我是唯一一

我正在开发一个远程控制应用程序来控制我的所有设备(电视、媒体中心等)。我最初编写这个应用程序是为了使用远程索尼API,它工作得很好,但现在我想尝试通过我的网络控制设备

我已经完成了使用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++;
    }
}
}
公共类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”;