1

みんな、

ビデオゲームのアプリケーションプログラミングインターフェイス(API)にアクセスするJavaでアプレットをコーディングしようとしていますが、Eclipse IDEを介してアプレットを正常に実行できますが、ブラウザから実行すると常にハングアップします。

最後の行が実行されるまでデバッグメッセージを分散させることで、バグがどこにあるべきかを絞り込みました。

パラメータが入力されたURLからの出力を解析しようとしています。ブラウザがこの情報をIDEとは異なる方法で渡す必要があることを理解するために、httpソケットを介してパラメータをPOSTするなど、さまざまな方法を試しました(ただし、この方法に慣れておらず、簡単に誤って実装できた可能性があります)。以下は私の現在のバージョンで、無関係な部分は省略されています(バグが省略された領域にある可能性があると推測する必要がある場合、これらは簡単に明らかになります):

...
URL apiCharList = null;
...
try {
    ...
    apiCharList = new URL("https:// ... ");
    URLConnection connection = apiCharList.openConnection();
    connection.connect();
    DataInputStream in = new DataInputStream( new BufferedInputStream( connection.getInputStream() ) );
    BufferedReader br = new BufferedReader( new InputStreamReader( in ) );
    String line = br.readLine();
    while( line != null ) {
        ...
        line = br.readLine();
    }
    ...
} catch (MalformedURLException e) {
    current.setText( "Malformed URL" );
} catch (IOException e) {
    current.setText( "InputStream fail." );
}

私のデバッグは私を次の場所に落としました:

connection.connect();

そして、その行がなければ、次のようになります。

DataInputStream in = new DataInputStream( new BufferedInputStream( connection.getInputStream() ) );

この問題への洞察は最もありがたいです。繰り返しになりますが、表示する必要があるかどうか/省略された領域をお知らせください。

敬具、お問い合わせ

アップデート

返信ありがとうございます。私のBufferedReaderは次のように初期化されます:

= new BufferedReader( new InputStreamReader( connection.getInputStream() ), 1 );

その部分は、私が試したさまざまな方法すべての組み合わせとして飛び跳ねていました。アイロンをかけてくれてありがとう。私が見ているところによると、問題は、ブラウザを介して実行するときに必要な接続を確立するために、アプレットにデジタル署名する必要があることです。私はそれを調査していて、最新のJDKをダウンロードした後、keytoolとjarsignerに問題がありました。私はほんの少しの間そこにいて、これまでにアプレットにデジタル署名したことはありませんが、少なくとも私は追求する新しい道を持っています。誰かがアプレットにデジタル署名する方法についての良い(最新の)ウォークスルーを提供できれば、それは最もありがたいことです。私が読んださまざまなことは、それが40USDから20USDまでどこでも私に費用がかかる可能性があると言いましたか?

とにかく、このハードルを乗り越えてくれてありがとう。敬意を表して、お問い合わせ

4

1 に答える 1

2

ブラウザは、デフォルトでは、アプレットが独自のオリジンサーバー以外の場所でネットワーク接続を行うことを許可しません。アプレットにデジタル署名してから、接続を確立する許可をユーザーに求める必要があります。別の方法は、アプレットがサードパーティサーバーと通信するために使用できるWebサーバー上で単純なプロキシサーブレットを実行することです。

余談ですが、なぜネットワークから読み取るためだけに、非常に多くのストリームを互いにラップし、そのうちの2つはバッファリングされているのでしょうか。これらの2行は次のように置き換えることができます

BufferedReader br = new BufferedReader( new InputStreamReader( connection.getInputStream() ), 1 );

最後に「、1」を押し込んだことに注意してください。これにより、BufferedReaderのバッファリングがオフになります。ネットワーク接続を先読みしたくない場合、またはコードをハングアップするように招待している場合。

于 2011-04-22T03:42:19.223 に答える