套接字,读写线程

时间:2012-12-07 09:32:54

标签: android multithreading sockets

使用套接字连接我需要有两个线程,一个用于读取,一个用于写入。我发现了有关套接字连接的其他问题,但我不明白我如何在两个不同的线程中使用相同的套接字。 我必须在与UI线程不同的线程中创建一个套接字,所以我需要启动一个线程来创建套接字。我在哪里可以开始这两个线程?

2 个答案:

答案 0 :(得分:2)

示例代码结构,为您提供一个想法。

public class SocketActivity extends Activity {
    Socket s;
    OutputStream dout;
    String ip = "127.0.0.1";
    int port = 8080;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    s = new Socket(ip, port);
                    new Thread(new ReaderRunnable(s));
                    new Thread(new WriteRunnable(s));
                } catch (IOException e) {
                    e.printStackTrace();
                    //Handle error state
                }
            }
        });
    }

    // You can put this class outside activity with public scope
    class ReaderRunnable implements Runnable {
        Socket socket;

        public ReaderRunnable(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            if (socket != null && socket.isConnected()) {
                try {
                    OutputStream out = new BufferedOutputStream(socket.getOutputStream());
                    //Do reader code
                } catch (IOException e) {
                    e.printStackTrace();
                }

            } else {
                //Handle error case
            }
        }
    }

    // You can put this class outside activity with public scope
    class WriteRunnable implements Runnable {
        Socket socket;

        public WriteRunnable(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            if (socket != null && socket.isConnected()) {
                try {
                    InputStream out = new BufferedInputStream(socket.getInputStream());
                    //Do writer code
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                //Handle error case
            }
        }
    }
}

答案 1 :(得分:0)

根据您的问题判断,这是客户方。您不必在两个不同的线程中使用套接字本身。对于读取线程,您使用套接字的InputStream,对于写入线程,您使用OutputStream。 这样您就不必为套接字创建单独的线程。读取和写入线程都可以从UI线程启动。为了创建线程,我引用了您的Android文档Processes and Threads