問題タブ [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 - 大きなByteBuffer用のBufferedReader?
最初に文字列に変換せずに、BufferedReaderを使用してByteBufferを読み取る方法はありますか?かなり大きなByteBufferをテキスト行として読みたいのですが、パフォーマンス上の理由から、ディスクへの書き込みは避けたいと思います。結果の文字列が大きすぎるため、ByteBufferでtoStringを呼び出すことはできません(java.lang.OutOfMemoryError:Javaヒープスペースがスローされます)。APIに適切なリーダーでByteBufferをラップする何かがあると思っていたのですが、適切なものが見つからないようです。
これが私がしていることを示す省略されたコードサンプルです):
java - 最大のデータセットに適合するJAVANIOByteBufferの割り当て?
私はオンラインゲームに取り組んでおり、サーバー側で作業しているときに少し問題が発生しました。
Javaでノンブロッキングソケットを使用する場合、すべてのデータが利用可能になるまで処理できない完全なパケットデータセットを処理するための最善のアクションは何ですか?たとえば、大きな2Dタイルマップをソケット経由で送信します。
私はそれを処理する2つの方法を考えることができます:
私の例の大きな2Dタイルマップを処理するために必要な完全なデータセットを処理するのに十分な大きさのByteBufferを割り当てます。すべてが受信され、そこから処理されるまで、読み取りデータをバッファーに追加し続けます。
ByteBufferのサイズが小さい場合(おそらく1500)、ファイルから完全に処理できるようになるまで、後続の読み取りを実行してファイルに出力できます。これにより、大きなByteBufferを使用する必要がなくなりますが、ディスクI/Oが原因でパフォーマンスが低下します。
すべてのSocketChannelに専用のByteBufferを使用しているので、処理が完了するまでデータを読み込み続けることができます。問題は、2Dタイルマップのサイズが2MBの場合、1000個の2MB ByteBufferを使用するのが本当に賢明ですか(1000がクライアント接続の制限であり、それらがすべて使用されていると仮定)?私が考えていないより良い方法があるに違いありません。
私は物事をシンプルに保ちたいと思いますが、私はどんな提案にもオープンであり、助けに感謝します。ありがとう!
java - select()が呼び出されている間、セレクターにチャネルを登録している間、Javaスレッドはブロックします。何をすべきか?
基本的な質問があります。SelectableChannelのregisterメソッドが呼び出しをブロックする理由と方法。シナリオを提供させてください。
次のように、RegisterクラスにSelectorオブジェクトを作成しました。
同じクラス(Register)にチャンネルをセレクターに登録するメソッドもあります。
また、Requestという名前の別のクラスがあります。このクラスには、チャネルからデータを読み取り、処理し、次のメソッドを呼び出してチャネルを登録するメソッドがあります。
ここで、この時点でスレッドはブロックされ、何を待っているのかがわかりません。セレクターが開いていることを確認しました。これを解決する方法を理解するために、私にいくつかの助けを提供してください。解除できるロックはありますか?
任意の入力をいただければ幸いです。
私が説明したことに加えて。さらにテストを行ったところ、Register.registerメソッドが同じスレッドから呼び出された場合は登録できますが、その後、他のスレッドがメソッドを呼び出そうとしても、スレッドは先に進みません。
java - nio サーバー上のスレッド間の静的セレクター
セレクター(静的)が1つしかないサーバーを実装する必要があります。複数のスレッドがチャネルを同じ静的セレクターに登録しようとします。
サーバーを実装しようとしましたが、問題は静的セレクターが初めて機能することです。つまり、チャネルを登録します。しかし、別のチャネルを登録するための次の呼び出しで、スレッドがハングします。
上記の説明は非常に曖昧であると確信しています。でも協力してください。任意のポインタをいただければ幸いです。
java - java.net.ConnectException: SocketChannel.open の呼び出し時に接続が拒否されました
ローカル アドレスへのソケット チャネルを開く簡単なプログラムを作成しようとしています。このプログラムを実行するたびに接続拒否例外が発生します
私が得る例外は
この問題は、Sun Solaris と HP - UX で発生します。Linux マシンでは問題なく動作するようです。接続が拒否される理由を誰か教えてもらえますか? netstat -a を実行し、ポートが使用されていないことを確認しました。
前もって感謝します!
java - Java の SocketChannel はデータを送信しますが、宛先アプリケーションに到達しません
NIO ライブラリを使用して、Java で単純な ChatServer を作成するのに苦労しています。誰かが私を助けることができるだろうか。私は SocketChannel と Selector を使用して、単一のスレッドで複数のクライアントを処理しています。問題は、新しい接続を受け入れてそのデータを取得することはできますが、データを送り返そうとすると、SocketChannel が機能しないことです。メソッド write() では、渡すデータと同じサイズの整数を返しますが、クライアントはそのデータを受け取りません。奇妙なことに、サーバー アプリケーションを閉じると、クライアントがデータを受け取ります。ソケットチャネルがバッファを維持しているようで、アプリケーションを閉じたときにのみフラッシュされます。
役立つ情報をさらに提供するために、いくつかの詳細を以下に示します。このコードでイベントを処理しています:
このコードは、チャットに接続したい新しいクライアントを処理するだけです。したがって、クライアントはサーバーへの TCP 接続を確立し、それが受け入れられると、単純なテキスト プロトコルに従ってデータをサーバーに送信し、ID を通知してサーバーへの登録を要求します。メソッド processIncomingDataFromNewClient(key) でこれを処理します。また、ハッシュテーブルに似たデータ構造で、クライアントとその接続のマップを保持しています。接続からクライアント ID を回復し、クライアント ID から接続を回復する必要があるためです。これは、clientsMap.getClient(key) で表示できます。しかし、問題自体はメソッド processIncomingDataFromNewClient(key) にあります。そこでは、クライアントから送信されたデータを読み取って検証し、問題がなければ、クライアントにメッセージを送り返し、チャット サーバーに接続されていることを伝えます。同様のコードを次に示します。
最後に、メソッド sendMessage(SelectionKey key) は次のようになります。
したがって、何が起こっているかというと、サーバーはメッセージを送信すると、次のようなものを出力します。
つまり、データを送信したことを示していますが、チャット クライアントはブロックし続け、recv() メソッドで待機しています。したがって、データは決してそこに到達しません。ただし、サーバー アプリケーションを閉じると、すべてのデータがクライアントに表示されます。なぜだろう。
クライアントは C であり、サーバーは JAVA であると言うことが重要です。私は両方を同じマシンで実行しており、Windows の下の virtualbox で Ubuntu ゲストを実行しています。WindowsホストとLinuxホストの両方で実行しても、同じ奇妙な問題が発生し続けます。
この質問が長くなって申し訳ありませんが、すでに多くの場所で回答を検索し、ここStackOverflowを含む多くのチュートリアルと質問を見つけましたが、合理的な説明が見つかりませんでした. 私はこの Java NIO が本当に好きではなく、多くの人が不満を言っているのを見ました。もし私がCでそれをやっていたら、それはずっと簡単だっただろうと私は考えています:-D
ですから、誰かが私を助けて、この振る舞いについて話し合うことができれば、それは素晴らしいことです! :-)
みなさん、よろしくお願いします。
ピーターソン
java - Java - 非ブロック ソケット用の複数のスレッドでの複数のセレクター
アプリケーションの反対側にある外部システムに接続して登録したクライアントを表すクラスのオブジェクトをインスタンス化する Java アプリケーションを作成しています。
各クライアント オブジェクトには、フロントエンドとバックエンドを表す 2 つのネストされたクラスがあります。フロントエンド クラスは継続的に実際のクライアントからデータを受信し、指示とデータをバックエンド クラスに送信します。バックエンド クラスはそのデータをフロントエンドから取得し、適切な形式とプロトコルを使用して外部システムに送信します。そのシステムが必要とします。
設計では、クライアント オブジェクトの各インスタンス化がスレッドになるようにしています。次に、各スレッド内には当然、[EDIT]それぞれ独自の NIO チャネルを持つ [/EDIT] 2 つのソケットがあり、1 つはクライアント側、もう 1 つはシステム側で、それぞれフロントエンドとバックエンドにあります。ただし、これにより、ノンブロッキング ソケットが必要になります。メインスレッドでセレクターを安全に使用して接続のあるすべてのスレッドを処理する方法を説明するチュートリアルを読んでいます。
しかし、必要なのは複数のセレクターで、それぞれが独自のスレッドで動作します。前述のチュートリアルを読んで、セレクターのキー セットはスレッドセーフではないことがわかりました。これは、それぞれにソケットとチャネルの独自のペアを与えようとすると、それぞれの個別のスレッドでインスタンス化された個別のセレクターが競合するキーを作成する可能性があることを意味しますか? セレクターをメイン スレッドに移動する可能性はわずかですが、与えられたソフトウェア要件に基づいて理想とはほど遠いものです。ご協力ありがとうございました。
java - ネットワークではなくファイルシステム用のJavaNIOフレームワーク?
NIOベースのネットワークプログラミングの複雑さを隠す高品質のフレームワークがいくつかあります(mina、netty、grizzlyなど)。NIOベースのファイルシステムプログラミングを簡素化する同様のフレームワークはありますか?
たとえば、学習演習として、次の(すばらしい!)記事に基づいてディスクでバックアップされたマップを実装したいと思います:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step。 html。
java - ボンネットの下でGrizzlyを透過的に使用しますか?
グリズリーダイナミック/トランスペアレントをJavaアプリケーションにバインドする方法はありますか(おそらくスプリングを使用して)?または、IO処理はWebコンテナ(Glassfishなど)の一部ですか?
java - SocketChannel.write() での Java NIO スレッドの問題
SocketChannel.write() を介して大量のデータを送信しているときに、基礎となる TCP バッファーがいっぱいになることがあります。データがすべて送信されるまで、write() を継続的に再試行する必要があります。
だから、私はこのようなものを持っているかもしれません:
問題は、大規模な ByteBuffer と基礎となる TCP バッファのオーバーフローが時折発生する問題であり、send() へのこの呼び出しが予期しない時間にわたってブロックされることを意味します。私のプロジェクトでは、何百ものクライアントが同時に接続されており、1 つのソケット接続によって引き起こされる 1 つの遅延により、1 つの SocketChannel によるこの 1 つの遅延が解決されるまで、システム全体がクロール状態になる可能性があります。遅延が発生すると、プロジェクトの他の領域で速度が低下するという連鎖反応が発生する可能性があり、遅延が少ないことが重要です。
この TCP バッファ オーバーフローの問題を透過的に処理し、SocketChannel.write() への複数の呼び出しが必要な場合にすべてをブロックすることのないソリューションが必要です。send() を Thread を拡張する別のクラスに配置して、独自のスレッドとして実行し、呼び出し元のコードをブロックしないようにすることを検討しました。ただし、維持している各ソケット接続のスレッドを作成する際に必要なオーバーヘッドが心配です。特に、99% の確率で SocketChannel.write() が最初の試行で成功する場合、スレッドが存在する必要がないことを意味します。 . (つまり、send() を別のスレッドに配置する必要があるのは、while() ループが使用されている場合のみです。バッファの問題が発生した場合のみ、おそらく 1% の時間です) バッファの問題がある場合1%の確率で、私はそうしません
それが理にかなっていることを願っています...いくつかの提案を実際に使用できます。ありがとう!