問題タブ [datainputstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2790 参照

java - Java DataInputStream readFully() の中断

サーバーからビデオ (MJPEG) をストリーミングする Java アプレットがあります。アプレットと複数のビデオ サーバーの間に配置するプロキシ サーバーを C# (Windows サービス) で作成しました。HTML/CSS/Js フロントエンドは、Java アプレットと共に使用されます。1 つのことを除いて、すべての機能が正常に動作します (最終的に!!!)。

ビデオ サーバーを使用すると、REST インターフェイスを介して録画したビデオを再生できます。クリップが終了すると、巻き戻しやシークなどのコマンドをサーバーに送信する場合に備えて、サーバーは接続を開いたままにします。クリップは最後までアプレットで正常に再生されています。新しいクリップを開始しようとすると (Javascript からアプレットにコマンドを送信する必要があります)、ブラウザがフリーズします。ただし、同じ接続を使用する後続のコマンド (再生、一時停止、シークなど) は機能します。Windows サービスを停止すると、ブラウザーは再び応答するようになります。

これは私が想定していることです: クリップが終了します (または一時停止されます)。これ以上データは送信されませんが、接続はまだアクティブです。アプレットはプロキシで次のフレームを待機していますが、プロキシはビデオ サーバーで次のフレームを待機しており、これ以上データを送信しません。

これは、各フレームを読み取る while ループのコードです。

何らかの方法でこのコードを中断する必要があります。

HTML フロントエンドで新しいビデオ クリップが選択されると、CameraStream クラスで disconnect() を呼び出すアプレットに通知します。これはその機能です:

これをテストするために、簡単なクリップを再生して最後まで実行します。次に、新しいクリップを選択します。私の Java コンソールでは、出力disconnect called.は得られますが、後続のclosed.メッセージは得られず、一般的な例外もキャッチされません。Windowsサービスを停止すると、ようやくメッセージが表示されるので、ブロックclosed.しているようです。inputStream.close();

だから私の質問は、どうすればブロックを止めることができるのでしょうか? readFully(img)通話がブロックされていますか? それとも切断機能ですか(コンソール出力で示唆されているように)?

編集:明確にするために、私は Java アプレット、HTML、CSS、Javascript、および C# プロキシ サーバーを作成したので、そのすべてのコードにアクセスできます。私が変更できない唯一のコードは、ビデオ サーバーの REST インターフェイスのコードです。

edit2:この投稿の報奨金を作るつもりでしたhttps://stackoverflow.com/questions/12219758/proxy-design-pattern

0 投票する
2 に答える
2269 参照

java - DataInputStream から int[] を読み取ります

DataInputStream から多数の int を読み取り、それらを配列にロードする方法を探しています。読み取る必要がある s の数は正確にわかっintていますが、単に反復するよりもクリーンな方法があればいいのにと思います。

メソッドを使用するだけで、バイト配列でこれを行う方法は既にありますが、にDataInputStream#read(byte[])相当するものはありませんint[]。長さを 4 倍したバイト配列を作成することで、明らかにデータをバイト配列に読み込むことができますが、実際にはints のデータが必要です。

私の見方では、使用できる可能性は 3 つあります。

  1. どういうわけか、データを直接ロードしますint[]
  2. どういうわけか を に変換byte[]int[]ます。
  3. 配列を反復処理し、単に使用しますreadInt()

最初の 2 つの解決策が非常に好まれていますが、現在のところ、どちらの方法もわかりません。反復せずにこれを行う簡単な方法はありますか?

0 投票する
1 に答える
384 参照

java - readDouble を使用してソケット入力から Double + EOL を読み取る

さて、私はここで必死になっています。私はこれに対する答えを探していましたが、運が悪くて4時間続きました。これが私がやっていることの要点です。ソケット経由で別のデバイスに接続する Android アプリがあります。出力ストリームが正しく動作しています (接続されたデバイスは、送信したバイト値を正しく受信できます。したがって、デバイスに 10 を送信すると、10 が認識されます)。反対に、私のアプリはデバイスにコマンドを送信するたびに入力を受け取ります。デバイスはコマンドを認識し、[DOUBLE+EOL] 構造のパケットを送り返します。EOL は特に 0x0A - '\n' です。

これをPythonで問題なく動作させることができました。ただし、私は非常に新しいJavaであり、これを完全に理解していません。私は多くのことを試しましたが、現在、使用してDataInputStream(socket.getInputStream())います。BufferedReader を使用してみましたが、文字列を希望どおりに double に変換できませんでした。これは、私が仕事をしようとしているコミュニケーションの重要なコードです:

コマンド「40」は、上記で指定された形式のパケットを送信するようにデバイスに指示するだけです。これcatch ( Throwable t )は、私が何を使用しているかを正確に把握するまでの代役に過ぎません (したがって、どのようなエラーが発生する可能性がありますか? Double.parseDouble() を使用しようとしたときに、もともとこれが変換型エラーをキャッチしました)。

それで、今何が起こっているのですか?TextView「left_servo_pos_view」にさまざまな値が表示されます。それらはすべて「e-312」の周りで終わります。これは、.readDouble() メソッドがストリームを通過するたびにストリームの一部を取得しているだけであることを示しています (したがって、送信している実際の Double 値の一部を取得しています。全部)。

それが私の問題です。必要に応じて追加の詳細を提供できます (他に何が役立つかはわかりません)。私が言ったように、この部分を除いてすべてが機能しているようです (そのため、初期化コードや、通信をセットアップする関数のようなものを提供していません)。input_stream の型を必要に応じて変更できます (先ほど言ったように、BufferedReader を試してみましたが、うまくいきませんでしたが、DataInputStream に戻りました。

ありがとう!

編集:

予想とはまったく異なる方法で問題を解決することになりました。コントローラからの出力のパケット キャプチャを行った後、データが「リトル エンディアン」スタイルで送信されていることがわかりました (理由はまだよくわかりませんが、コントローラがそれを実装する方法だと思います)。そこで、実装したリトル エンディアンの InputStream クラスをオンラインで見つけて、問題をほぼ解決しました。最初の値は正しく、それが再び正しくなるまでにさらに 8 つの値が必要です。それで、パケットに何か欠けているものがあると考えました。詳しく調べたところ、最後に余分なバイト「00」があります。そこで、コードに「skipBytes(1)」を追加したところ、正しく機能するようになりました。

0 投票する
2 に答える
515 参照

java - 2 つのスレッドが datainputstream から読み取ったときに EOS に達しました

私は、プログラムがソケットから読み取るスレッドを作成するプログラムを作成しています。私の問題は、2 つのスレッドが作成され、両方とも datainputstream から読み取られることです。1 つのスレッドが適切に読み取り、もう 1 つのスレッドが EOS に遭遇し、読み取りバイトとして -1 を返します。実行方法を同期しました

0 投票する
1 に答える
1005 参照

java - 画像ファイルへのJavaDataInputStream

私は宿題をしていて、httpサーバーに接続し、ソケットプログラミングを使用してhtmlファイルと画像ファイルをダウンロードする必要があります。

私はうまくやっていて、htmlファイルと画像ファイルの両方を正しくダウンロードして書き込むことができます。しかし、宿題の要件を満たすようにコードを編集すると(Webページはローカルで機能する必要があるため、コードを編集してhtmlを書き換えると、画像ファイルが正しく書き込まれません。

画像をダウンロードするメソッドのコードを編集したことを覚えていません。完了したと思ったときにファイルをチェックしたところ、画像に無効な画像が表示されていました。

バイト(notepad ++で正しい画像とダウンロード画像を並べて開くと)、バイトは同じです。問題は、ダウンロードされたイメージでは、バイトが1つの長い行として書き込まれるのに対し、正しいイメージでは、バイトが1行ずつ書き込まれることです。

いくつかの異なる方法を試しましたが、どちらも機能しませんでした。実際、(上記の編集前に)友人に送信した古いコードも機能していないようです。何か案は?

助けてくれてありがとう!

0 投票する
2 に答える
164 参照

java - Webサイトからすべてのバイトを取得できません

Webサイトからすべてのバイトを読み取ろうとしていますが、すべてのバイトを取得できないと思います。バイト配列の長さに高い値を指定します。このメソッドを使用しましたが、常に例外が返されます。

コードは次のとおりです。

編集されたバージョン:

0 投票する
1 に答える
1314 参照

java - AndroidJava-ソケットから文字列へのDataInputStream

サーバーと通信してデータを送受信できるAndroidアプリを作成するのに少し問題があります。つまり、私のサーバーはQt C ++で書かれており、もちろん、私のアプリはAndroid用のJavaで書かれています。ソケットデータを双方が完全に理解できる適切な形式にすることで、多くの問題が発生しました。

私が抱えている問題は、クライアント(java android)がサーバーに接続し、少量のデータを送信し、サーバーから応答を受信できることです。サーバーは、UTF-8バイトに変換されたかなり大きなサイズのデータ​​メッセージを送信します。

msgは、関数に渡されるQStringです。

クライアント側では、メッセージを受信すると、次のようになります。

したがって、問題は、プログラムのインスタンスが異なると、Stringにキャストされるバイトの結果が異なることです。

Log.dが応答を出力した結果は、文字列の約1445文字(2890バイト)が正しく文字列にフォーマットされ、残りの文字列は「??」になります。文字。

「?」が表示されずにメッセージ全体が期待どおりに表示されることはめったにありません。文字。時々、メッセージの長さが長くなり、文字列として正しくキャストされることがあります。ほとんどの場合、1445の文字が正しくキャストされ、残りは「??」です。文字。

私はWindowsコンピューター用の別のクライアント(これもQt C ++で書かれています)を持っており、常にメッセージを完了し、この問題は発生しません。そのため、この問題を引き起こしている可能性のあるAndroidの文字列とエンコードに何かがあるかどうか知りたいです。最初は文字列のメモリ割り当てに関係があるのではないかと思っていましたが、サイズを設定することで適切に処理できたと確信しています。

0 投票する
2 に答える
12662 参照

java - deprecated readLine() 何を変更しますか?

私はJavaの初心者で、これをEclipseで動作させようとしています。ただし、 にreadLine取り消し線が引かれ、非推奨であるという通知が表示されます。少しではありませんが、コードは機能しwhile ((var2 = var5.readLine()) != null) { ます...だから、それを修正する方法を考えています。

0 投票する
3 に答える
156 参照

java - EOFExceptionを取得する代わりに、ファイル内のデータが利用可能になるのを待つにはどうすればよいですか?

ストリーミングコンテンツをバッファリングするファイルを使用して表示しています(RAMに保持するのに十分な大きさである可能性があるため)。2つのスレッドがあります。1つはサーバーからファイルをダウンロードしてローカルストレージに書き込み、もう1つはそのファイルを読み取ってコンテンツを表示します。

問題は、2番目のスレッドがファイルの終わりに達すると、メソッドEOFExceptionからスローされることです。DataInputStream.readFully()例外をスローする代わりに、最初のスレッドが十分なデータを書き込んでいる間、待機させる方法はありますか?

0 投票する
2 に答える
628 参照

java - DataInputStream を使用して読み取られた TCP ソケットからのバイトの前にある不要なヌル文字

TCPサーバー(私も書いた)に接続し、そこからテキストを送受信するAndroidアプリを書いています。現在、最終読み取り (クライアント側) にバグがあります。

Eclipse でデバッガーを使用すると、送信されたすべてのバイトを受信して​​いることがわかりますが、特定のテキストについては、nバイトを期待している場合、最初のn - k、いくつかの m NUL バイトを取得します。 、そして最後のk - m意味のあるバイト。私が問題を正しく解釈している場合、Java は膨大な量の 0 を見て、後で読み取るのに役立つものは何もないと判断しています (デバッガーはバイト配列とそれが変換された文字列を表示しますが、試してみるとそれを破棄します)さらに検査します)。

NUL の大量流入を無視して、重要なものだけを読むにはどうすればよいでしょうか?

書き込みを行っているサーバー コードは次のとおりです。