如何从线程中的套接字获取数据?

时间:2010-12-05 01:40:03

标签: android multithreading sockets

Android noob在这里。通过查看功能示例的源代码,我学到了最好的东西,但是我无法找到在自己的线程中使用套接字的简单但完整的示例。

我有一个需要与互联网通信的Android服务。我想打开连接到Internet上的服务器的TCP套接字。该服务需要将数据发送到Internet,并且从网络返回的数据将需要转到该服务。由于服务也在做其他事情,因此套接字连接需要存在于自己的线程中。

我知道在哪里可以找到一个与套接字通信的线程中的套接字示例?

由于

enter image description here

2 个答案:

答案 0 :(得分:15)

您只需创建一个在后台进行通信的异步任务,然后根据需要更新UI线程。以下是从套接字获取信息并使用接收的字节数更新文本视图的后台线程

  public class InternetTask extends AsyncTask<Void, Integer, Void> {

    private WeakReference<TextView> mUpdateView;

    public LoginTask(TextView view) {
        this.mUpdateView = new WeakReference<TextView>(view);
    }

    @Override
    protected Void doInBackground() {

        try {
            Socket socket = new Socket("127.0.0.1", 80);
                    InputStream is = socket.getInputStream();

                    byte[] buffer = new byte[25];
                    int read = is.read(buffer);
                    while(read != -1){
                         publishProgress(read);
                         read = is.read(buffer);
                    }

                    is.close();
                    socket.close();



        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        if(mUpdateView.get() != null && values.length > 0){
                     mUpdateView.get().setText(values[0].toString());
                }
    }

}

以下是你如何解决这个问题

public class TestTab extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.someLayout);

            TextView textView = (TextView)findViewById(R.id.someid);
            InternetTask task = new InternetTask(textView);
            task.execute();

    }
}

答案 1 :(得分:8)

这是一个关于这个主题的长篇博客,其中显示了服务器和客户端部分,套接字通信通过一个单独的线程。

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

要注意的一件事是,如果你传递int s,你可能遇到字节顺序问题,所以,只做一些测试,我建议你确保服务器以格式发送如果您在多个操作系统上安装了服务器,则需要Android。

一个简单的方法,在Android上找到字节顺序,你可以使用它:http://developer.android.com/reference/java/nio/ByteOrder.html

根据这篇文章,可以交换字节顺序以进行优化: http://en.wikipedia.org/wiki/Dalvik_(software)