Java MIDP中的复杂网络:如何关闭URL连接

Java MIDP中的复杂网络:如何关闭URL连接,java,networking,midp,Java,Networking,Midp,我正在尝试编写一个MIDP应用程序,它可以进行大量的网络连接。这一切都是通过HttpURLConnection完成的(这是该平台所支持的全部;套接字不起作用)。导致问题的主要部分是在一组HTTP连接上隧道一个InputStream和一个OutputStream的代码,这样每次读写都会变成一个单独的POST请求 我发现,虽然在MIDP中进行联网并不太糟糕,但停止在MIDP中进行联网却是一场噩梦。我发现我最终会遇到很多线程,它们都被read()或write()阻塞,找到它们并杀死它们真的很难。线程.

我正在尝试编写一个MIDP应用程序,它可以进行大量的网络连接。这一切都是通过HttpURLConnection完成的(这是该平台所支持的全部;套接字不起作用)。导致问题的主要部分是在一组HTTP连接上隧道一个InputStream和一个OutputStream的代码,这样每次读写都会变成一个单独的POST请求

我发现,虽然在MIDP中进行联网并不太糟糕,但停止在MIDP中进行联网却是一场噩梦。我发现我最终会遇到很多线程,它们都被read()或write()阻塞,找到它们并杀死它们真的很难。线程.interrupt()在Java的InputStream.read()和OutputStream.write()中不起作用,并且对流调用close()并不总是可能的,因为流可能隐藏在URLConnection中,而URLConnection本身没有任何方法告诉它关闭连接

我的平台对清理工作过于挑剔,这也于事无补。例如,如果在应用程序退出时让线程保持运行,则系统将重新启动。我怀疑它在与主设备UI相同的VM中运行我的midlet

那么:有谁能建议我应该采用一种合适的结构来简化这类事情吗?因为现在它正在变成一个由线程、捕捉块、中断和IOException组成的分形迷宫,我很快就不知道它应该如何工作了

或者,包装URLConnection的事件驱动IO库也很方便。唉,这是MIDP,所以nio或通道之类的东西都不是一个选项


编辑:更新:事实证明它毕竟不是MIDP,而是PBP1.1。啊,文件不足的乐趣。不过,它们并没有太大的不同,供应商告诉我们,唯一有效的网络系统是HttpURLConnection。

您不仅会遇到不同手机的不同网络问题,还会遇到不同配置和运营商、固件、网络和网络状况的不同网络问题

这就是说,您可以自由地使用套接字实现HTTP客户机——除了最旧的手机之外,您的假设在所有手机上都不成立。另外,您还应该看看Connection.close()方法。我目前正在使用以下close方法,该方法简单但有效:

public void close() {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            inputStream = null;
        }
    }
    if (outputStream != null) {
        try {
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            outputStream = null;
        }
    }
    if (connection != null) { 
        try {
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connection = null;
        }
    }
    closed = true;
}
如果这不起作用,你就注定要失败。换句话说,你不应该假设你能让你的MIDP在所有的MIDP手机上完美地工作——因为你不会。设计着眼于全局,不要花时间调试存在无可救药缺陷的MIDP实现


您可能需要同步。

您不仅会遇到不同手机的不同网络问题,还会遇到不同配置和运营商、固件、网络和网络状况的不同网络问题

这就是说,您可以自由地使用套接字实现HTTP客户机——除了最旧的手机之外,您的假设在所有手机上都不成立。另外,您还应该看看Connection.close()方法。我目前正在使用以下close方法,该方法简单但有效:

public void close() {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            inputStream = null;
        }
    }
    if (outputStream != null) {
        try {
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            outputStream = null;
        }
    }
    if (connection != null) { 
        try {
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connection = null;
        }
    }
    closed = true;
}
如果这不起作用,你就注定要失败。换句话说,你不应该假设你能让你的MIDP在所有的MIDP手机上完美地工作——因为你不会。设计着眼于全局,不要花时间调试存在无可救药缺陷的MIDP实现


您可能需要同步。

我假设您指的是MIDP连接和HttpConnection,而不是Java SE URLConnection和HttpURLConnection?嗯。这很有趣——我指的是URLConnection。所讨论的设备非常奇怪,并且有一个完全定制的MIDP实现(因此我很痛苦);我没有支持哪些类的最终列表。很明显,他们混合了一些硒元素。这会让我的工作更难还是更糟…?更糟;因为我猜这意味着你只能使用一个设备,而它无法工作。如果某些类型的线程(如系统事件中的线程)无法进行联网,您应该进行检查-但是您可能会看到网络模块崩溃,深入设备内部,超出您的能力范围。更新至最新固件或记录错误。我想你指的是MIDP连接和HttpConnection,而不是Java SE URLConnection和HttpURLConnection?嗯,这很有趣,我指的是URLConnection。所讨论的设备非常奇怪,并且有一个完全定制的MIDP实现(因此我很痛苦);我没有支持哪些类的最终列表。很明显,他们混合了一些硒元素。这会让我的工作更难还是更糟…?更糟;因为我猜这意味着你只能使用一个设备,而它无法工作。如果某些类型的线程(如系统事件中的线程)无法进行联网,您应该进行检查-但是您可能会看到网络模块崩溃,深入设备内部,超出您的能力范围。更新至最新固件或记录错误。你有我的同感……好吧,结果证明我没有使用MIDP的连接,我使用的是JavaSE的URLConnection(他们不知怎么地把URLConnection塞进了设备)。很抱歉给你带来了困惑。URLConnection没有close()方法,尽管HttpURLConnection有一个disconnect(),但这并不是我想要的。。。有什么想法吗?好吧,结果证明我没有使用MIDP的连接,我使用的是JavaSE的URLConnection(他们以某种方式嵌入到设备上)。很抱歉给你带来了困惑。URLConnection没有close()方法,尽管HttpURLConnection有一个disconnect(),但这并不是我想要的。。。有什么想法吗?