【问题标题】:Socket, Read and Write threads套接字,读取和写入线程
【发布时间】:2012-12-07 09:32:54
【问题描述】:

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

【问题讨论】:

  • 您可以在一个线程中创建套接字并将其传递给另一个线程,为什么不呢?您也可以创建线程派生类实例,并在实际启动线程之前传递它所需的一切。问题到底出在哪里?
  • 问题是我需要一些代码,这将是一个有用的示例,说明如何在不同线程之间使用套接字

标签: android multithreading sockets


【解决方案1】:

示例代码结构给你一个想法。

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
            }
        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @jane1012 不,不在 UI 线程中,否则在连接时会阻塞 UI。启动一个单独的线程来创建和连接套接字。该线程也可以是读或写线程,它可以启动另一个。
    • 正如@EJP 所说,从 UI 线程执行 I/O 是完全错误的。此外,我们不知道一个线程是否足够——也许需要全双工通信(而不是循环中的请求/响应)?你只是不知道。
    • 谢谢回复。客户端在输入和输出中管理异步数据流,前端无法按照请求消息的相同顺序响应。这就是为什么我需要 2 个线程来发送和接收消息
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2015-07-12
    相关资源
    最近更新 更多