2

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

4

2 回答 2

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
            }
        }
    }
}
于 2016-04-07T09:57:20.157 回答
0

从你的问题来看,这是客户端。您不必在两个不同的线程中使用套接字本身。对于读取线程,您使用套接字的 InputStream,对于写入线程,您使用 OutputStream。这样您就不必仅为套接字创建单独的线程。读取和写入线程都可以从 UI 线程启动。对于创建线程,我建议您参考 Android 文档进程和线程

于 2012-12-07T09:50:06.783 回答