如何在具有单工连接的设备上读写Java ME中的网络套接字?

时间:2009-03-10 17:22:41

标签: java networking sockets java-me mobile

我正在使用移动通信器并在使用以下方法建立与服务器的连接后(为了说明我正在使用 StreamConnection InputStream OutputStream < / strong>)我在两个单独的线程之间分发 inputStream outputStream ,让我们称之为 Sender Receiver

连接方法:

private InputStream inputStream;
private OutputStream outputStream;
private StreamConnection connection;

    public void connect(String host, String port) throws IOException {

        String connectionString = "socket://" + host + ":" + port;
        connection = (StreamConnection) Connector.open(connectionString);

        inputStream = connection.openDataInputStream();
        outputStream = connection.openOutputStream();
    }

发件人线程正在等待out缓冲区中出现的任何内容。当输出缓冲区为空时,发件人等待(通过在发送方线程上调用wait()方法)。输入缓冲区的任何输入都在发送线程上调用notify()方法。

Receiver 主题使用int available()方法轮询 InputStream ,当有东西要接收时,它会调用阻塞int read()方法。一切都像各种模拟器中的魅力一样,而且我很方便。我们很方便。

然而,有一部电话似乎没有。只要一个线程在 InputThread 对象上调用available()read(),而另一个线程在 OutputStream 对象上调用write(),则输入流完成。所有后续读取都将返回值 -1 ,这意味着InputStream已关闭。

在大量google-fu之后,我遇到了 this post on nokia forums ,其中正在讨论设备的单工/双工属性,而我遇到问题的设备似乎就是这种情况。通常(99%的时间)调用read()和write()可以同时没有任何问题。

我的问题是:有没有人遇到过类似的问题?你是如何解决一个线程独立读取的问题,而另一个是独立写入已建立的连接,以便在调用write()时不调用read()或available()?

任何方向的任何指示都非常感谢!

2 个答案:

答案 0 :(得分:3)

通常,当我们谈论多线程应用程序时,保证很少。我建议在您的应用程序中使用单个线程,并尝试使用单个工作程序进行管理。有些设备确实存在行为问题,因此我们在一台设备上看到的内容似乎无法在其他设备上运行。

我在手机游戏方面做了大量工作,必须在不影响游戏速度的情况下渲染大量动画。我已经意识到你可以用一个线程做更多的事情,它使你的应用程序非常便携(几乎没有任何变化)。

如果您正在等待线程完成READ或WRITE操作,那么看起来您实际上是按顺序执行此操作。所以或多或少,多个线程会使事情变得复杂。相反,基于一些预定因素构建了一个等待通知机制,并允许SINGLE线程读取或写入套接字流。与此方案相比,在线程之间切换是一项非常昂贵的操作。 希望这能回答你的问题。

答案 1 :(得分:2)

在这类问题与移动网络运营商之间收集数据之间,大多数移动Java开发人员使用“http://”协议而不是“socket://”。

当然,这意味着不再使用双工连接,而是发出许多GET和POST请求。

远非理想,我知道。