Android网络套接字设计

时间:2016-07-28 15:23:13

标签: java android sockets udp

我们有一个正在传输和接收数据的应用程序。我们的想法是双向发送和接收消息。

对于传入消息,我们的系统运行以下技术:

public void run() {
    try {
        socket = new DatagramSocket(null);
        socket.bind(new InetSocketAddress(port));
        socket.setReuseAddress(true);

        while (!Thread.currentThread().isInterrupted() && bContinue) {
            DatagramPacket packet = new DatagramPacket(buf, buf.length);

            socket.receive(packet);

            processPacket(packet)
        }
    } catch (SocketException e) {
        Log.v(TAG, "Socket closed exception");
    } catch (Exception e) {
        Log.e(TAG, "Error starting the socket listener");
        e.printStackTrace();
        return;
    }

    if (socket != null) {
        // Socket teardown omitted...
    }
}

这似乎非常适合接收数据包。我的问题在于数据包的传输。这两种思想流派要么

  1. 为每个将发送消息的数据包创建一个单独的线程
  2. 创建一个从队列接收消息并将其发送出去的单个线程
  3. 这两种方法的伪代码类似于:

    public void run1() {
        socket.open();
        socket.sendMessage();
        socket.close();
    }
    
    public void run2() {
        socket.open();
        while (1) {
            message = BlockingMessageQueue.take();
            socket.send(message);
        }
        socket.close();
    }
    

    每次收到或传输数据包时,前者都会打开,发送和关闭。后者创建一个单独的线程,等待数据包并一次发送一个。

    做前者与后者有什么好处?数据包通常每10秒发送一次,因此是否存在任何设计缺陷;保持插座打开状态"在一个单独的线程?我已经习惯了嵌入式世界,程序设计只能启动必要的线程,并让它们尽可能地阻塞。我见过的一些设计广泛使用定时器来启动数据包传输等线程,这是我不习惯的惯例。

    感谢您的帮助!

0 个答案:

没有答案