gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:34:57 25 4
gpt4 key购买 nike

我正在使用移动通信器,在使用以下方法建立与服务器的连接后(说明我正在使用StreamConnectionInputStreamOutputStream) 我在两个单独的线程之间分配 inputStreamoutputStream,我们称它们为 SenderReceiver

连接方式:

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();
}

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

Receiver 线程使用 int available() 方法轮询 InputStream,当有东西要接收时,它调用阻塞 int读取()方法。在各种模拟器和我手边的少数设备中,一切都像魅力一样。

然而,有一部手机似乎行为不端。每当一个线程在 InputThread 对象上调用 available()read(),而另一个线程调用 write()OutputStream 对象上,输入流结束。所有后续读取都将返回值 -1,这意味着 InputStream 已关闭。

大量谷歌搜索后,我遇到了 this post on nokia forums ,其中讨论了设备的单工/双工属性,我遇到的设备似乎就是这种情况。通常(99% 的时间)可以同时调用 read() 和 write() 而不会出现任何问题。

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

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

最佳答案

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

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

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

关于java - 如何在具有单工连接的设备上读取和写入 Java ME 中的网络套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com