問題タブ [nio]
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.
java - Java:文字列をByteBufferとの間で変換することおよび関連する問題
ソケット接続にJavaNIOを使用しており、プロトコルはテキストベースであるため、SocketChannelに書き込む前に文字列をByteBufferに変換し、着信ByteBufferを文字列に戻す必要があります。現在、私はこのコードを使用しています:
これはほとんどの場合機能しますが、これがこの変換の各方向を実行するための好ましい(または最も簡単な)方法であるかどうか、または別の方法で試すことができるかどうか疑問に思います。変換が行われるたびに新しいByteBufferオブジェクトを使用している場合でも、ときどき、一見ランダムに、例外などを呼び出してencode()
スローdecode()
し
ます。java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
これらのメソッドを同期する必要がありますか?文字列とByteBufferの間で変換するためのより良い方法はありますか?ありがとう!
java - Java: SelectionKey.attach() は壊れていますか?
Java NIO の私の実装では、SelectionKey.attach() を機能させることができませんでした。基本的に、クライアントが接続したら (OP_ACCEPT 関心操作)、クライアントの IP アドレスがクライアントの状態を維持するオブジェクトにマップされるマップに追加します。次に、OP_READ が発生すると、クライアントの IP アドレスを再度取得し、今度はマップから値を取得して、クライアントの状態オブジェクトを取得します。
ここでの問題は、データがネットワークから読み取られるたびにマップ ルックアップを実行する必要があることです。そこには無駄な作業がたくさんあります。そのため、別のイベントを処理している場合でも (OP_READ 中に取得するのではなく、 OP_ACCEPT 中にマップします)。
問題は、それが機能しないことです。添付ファイルを取得すると、常に null になります。そして、attach() を介して添付ファイルをセットアップし、すぐに attachment() を呼び出すと、機能します。どういうわけか、異なるイベントの間に、それはその関連付けを失います。
申し訳ありませんが、私のコードをここに投稿するには少し長くなりますが、このスレッドのコメントを見ると: リンク テキスト ...基本的に同じ結論に達している他の人もいることがわかります: attach() とattachment() は機能しません。
それを機能させるためのトリックはありますか、または処理する新しい読み取りイベントがあるたびにマップで手動でルックアップを行うために必要な邪悪なオーバーヘッドに悩まされていますか?
最後に、attach() と attachment() を適切に処理する新しいサブクラスに SelectionKey を「ラップ」する方法はありますか?
ありがとう!
java - Java NIO: 可変サイズのブロックの読み取り
実際のデータが続くバイト長で指定された TCP ストリームから文字列を読み取りたいと思います。Pythonでは、私はそうします
Java NIO で同じことを行うにはどうすればよいですか? 私が持っているのはバッファです(容量257)
残念ながら、これは機能しません: get() 呼び出しはバッファ内のデータを読み飛ばします:-(
おそらく、フリップ、巻き戻し、リセットなどの組み合わせが必要ですが、わかりません。
java - Selector.closeがAIXプラットフォームでjava.util.ConcurrentModificationExceptionをスローします
私はjavanioセレクターを使用していますが、selector.closeを呼び出している間、アプリケーションで次の問題がランダムに発生するようですが、一貫して発生します。セレクターオブジェクトは、私のアプリケーションの単一のスレッドによってアクセスされています。同じアプリケーションがSolaris、Linux、およびWindowsで正常に動作します。これはセレクターのAIX実装に問題があると思います
javaバージョン
どんなポインタでも大歓迎です、
前もって感謝します、
ビジェイ
java - 選択可能なファイル チャネルを使用した複数ファイルの収集
以前に散らばっていたファイル セグメントからデータを読み取って結合できるマルチファイル ギャザラー入力ストリームを実装しました。ただし、現在のバージョンでは、固定サイズの ExecutorService とともに RandomAccessFile を使用し、多くの CPU オーバーヘッドを伴います。これらの I/O スレッドを回避し、単一スレッドのセレクター ベースのアプローチを実行したいと考えています。残念ながら、FileChannel (または JDK7 の Path.newByteChannel()) は選択できません。このデータ収集を NIO の方法で行う方法はありますか?
java - Java nio、チャネルの読み取り、書き込みの準備ができているかどうかを確認
準備ができているチャネルごとにメッセージを決定して送信できる通常の方法でセレクターを使用する代わりに、現在準備ができている接続を選択してそこにメッセージを送信したいと思います。
おそらくこれは、すべてのチャネルを読み取り用のセレクターに投入し、それらが出てきたら読み取りの準備ができているとマークし、次に書き込み用に同じことを行い、準備ができているとマークしたものの中から選択することで実行できます。
これは良い考えですか、これを行うためのより良い方法はありますか、何に注意する必要がありますか? たとえば、Rox チュートリアルには、 「OP READ と OP WRITE を混在させようとすると、すぐに問題が発生します。これを行うと、Sun Windows の実装がデッドロックすることが確認されています。」と記載されています。ここに同様の落とし穴はありますか?実装する最良の方法は何ですか:
java - ソケットチャネルでシリアル化されたオブジェクトを送受信する方法
シリアル化されたオブジェクトをソケット チャネル経由で送信したいと考えています。「こんにちは友達」の文字列をシリアル化されたオブジェクトとして作成し、このオブジェクトをソケットチャネルに書き込み、反対側で同じオブジェクトを読み取ってデータを取得したい.
Java を使用してやりたいことすべてSocketChannel
。これを行う方法?以下のように試しましたが、受信側でデータを取得できませんでした。
java - NIO実装に最適なモデル?
私はJavaコードをNIOを使用するように変換している最中ですが、それを設計するための最良の方法がわかりません。
私の最初のアプローチは、セレクタースレッドのプールを作成することでした。スレッドは必要に応じて開始/強制終了され、チャネルはラウンドロビン方式で接続/受け入れられるとセレクタースレッドに登録されます。そこから、各スレッドはselect()でブロックし、ウェイクアップすると、選択されたキーを持つ各チャネルに関連付けられた適切なコールバックを実行します。
この「複数のセレクタースレッド」の設計に加えて、単一のセレクタースレッドとディスパッチスレッドのプールを使用すると言われることもあります。IO操作を実行する準備ができると、セレクターはディスパッチャースレッドに通知し、ディスパッチャースレッドはリクエストを処理します。このモデルには、IOスレッドをブロックしないという利点がありますが、現在、すべてのIOを単一のスレッドに強制し、ディスパッチャーで同期/イベントキューを処理しています。
さらに、各チャネルを読み取るために単一の直接バイトバッファを使用して、それをコールバックに直接渡すことはできません。代わりに、読み取りが発生するたびにデータを配列にコピーしてリセットする必要があります。(おもう..)
これを実装するための最良の方法は何ですか?
java - Java セレクター NIO 読み取りの問題
関連するコード -- 注意 命令は、データを操作するいくつかのメソッドを持つ単なるクラスです。新しいスレッドが作成され、読み取られたデータで動作します。
スレッドを読む:
READCHANNEL
その後、新しいスレッドはさらにInstructions
メソッドを呼び出します。
ins 関数が終了すると、Writer に書き込む場合があります。
クライアント (Flash ムービー) が出力を受信して処理することを確認できます。
最後に、w
終了します。
ただし、クライアントから最初のメッセージを受信し、処理が成功した後は、READ THREAD
ループによって処理されるメッセージはなくなります。キーはセレクターに登録されており、読み取る準備ができていると思います。すべてのキーをループして、チャンネルで isReadable と isRegistered で読み取れるかどうかを確認しましたが、これまでのすべてのケースで結果が true です。ただし、クライアントから 2 番目のメッセージが送信されると、読み取りスレッドに表示される唯一の応答は「.」文字は 0.5 秒ごとに出力されるのではなく、継続的に高速に出力されます。したがって、データはチャネルにあると思いますが、何らかの理由でセレクターがキーを選択していません。
誰でも私を助けることができますか?
java - Javaシリアル化可能、ObjectInputstream、ノンブロッキングI / O
私はJavaシリアル化を始めたばかりであり、非ブロッキングI/Oを使用するシナリオでソースからオブジェクトを取得する方法がわかりません。
私が見つけることができるすべてのドキュメントは、ObjectInputStreamの使用がシリアル化されたオブジェクトを読み取る適切な方法であることを示唆しています。ただし、前述したように、私はjava.nioを使用しており、非ブロッキング操作を実行しています。新しいオブジェクトが利用可能になるまでreadObject()がブロックする場合、これは役に立ちません
まとめ..JavaNIOを使用する場合、どのようにシリアル化を行いますか?