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

Lan*_*ure 9 sockets multithreading android

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

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

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

谢谢

在此输入图像描述

Bri*_*fey 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());
                }
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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();

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以在异步任务上定义所需的任何其他方法.只要知道doInBackground()方法将是唯一一个在单独的线程上执行的方法.您还可以将要在构造函数中发送的数据传递给execute()方法. (2认同)
  • 我认为`InternetTask`构造函数中存在拼写错误.它应该是`public InternetTast(TextView view)```public LoginTask(TextView view)` (2认同)

Jam*_*ack 8

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

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

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

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

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