問題タブ [socketchannel]
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 NIO。SocketChannel.read メソッドは常に 0 を返します。なぜですか?
Java NIOの仕組みを理解しようとしています。特に、SocketChannel はどのように機能しますか。
私は以下のコードを書きました:
- Googleサーバーに接続してみます。
- サーバーにリクエストを送信します。
- サーバーから回答を読み取ります。
ただし、メソッド socketChannel.read(buf) は常に 0 を返し、無限に実行されます。
どこで間違えた??
size - Java NIO ByteBuffer : 完全なメッセージを読み取る前に、ヘッドのメッセージ サイズを読み取る
メッセージを受信するJava NIOサーバーを作成しています。各メッセージのサイズはメッセージの先頭にあるため、最初にデフォルトサイズ(44)のバッファーに読み込んでから、このバッファーから完全なサイズを取得します、次に、残りのメッセージ(本文)を取得することになっている新しいバッファを作成し、 System.arrayCopy() を使用して完全なメッセージで配列を作成します。この操作は正常に機能しています。問題は、2 番目のバッファー (メッセージの本文) にサイズがありますが、正しいデータが含まれていないことです。あなたが何か間違っている場合は、ここに私のコードがあります:
バイトメッセージを作成し、そのサイズをヘッドで作成してから送信する単純なクライアントがあります。
ありがとう
java - セレクターでSocketChannelを読み取るJavanio
複数のクライアントから接続を受信する小さなサーバーアプリケーションがあります。クライアントは接続し、メッセージを送信して切断しますが、応答は返されません。
ServerSocketChannelを使用して接続をリッスンしています。セレクターを使用して新しい接続の通知を受け取ります。これが発生した場合、SocketChannelをセレクターに登録します。SelectionKey.OP_READ
いつ通知を受け取るかわからないのは、データを読み取ることができるということです。私のSocketChannelsはノンブロッキングモードです。channel.read(buffer)
SocketChannelを呼び出してバイトバッファに読み込みます。読み取り用のjavadocから、ストリームの終わりを示す-1が得られるまで、これを繰り返し呼び出す必要があります。ただし、再度readを呼び出す前に、セレクターが再度通知するのを待つ必要があるかどうかはわかりません。あれは:
- セレクターからデータが利用可能であることが通知されます。
- 私は既読と呼びます
- 次に、-1が返されるまでもう一度readを呼び出す必要がありますか、それともセレクターに通知させてからもう一度readを呼び出す必要があります。
どうもありがとう
java - JavaNIO。なぜflip()メソッドが私のプログラムを壊すのですか?
以下のJavaコード:
実結果:
書き込み:1017読み取り:0読み取り:1024読み取り:44
初めて、メソッドread()
は0バイトを読み取りました。かっこいいじゃない。
コードを変更しました:
実績:
書き込み:1017読み取り:1024読み取り:44
すでに良く見えます。これをありがとうflip()
!
次に、バッファ文字列"Request"に入れます。この文字列の長さは7ですが、メソッドは1017write()
を返しました。
どのような情報方法がチャネルに書き込まれましたか?
そのメソッドが文字列「Request」を書き込んだかどうかはわかりません。
わかりました。コードをもう一度変更しました。
実績:
書き込み:7
とコードがクラッシュしました...
なぜですか?私の間違いはどこにありますか?
ありがとう。
java - Java NIO: データを含まないチャネルからデータを読み取ります。この状況をどのように処理しますか?
以下の Java コード:
このコードは簡単です。
ただし、チャネルにはデータを書き込んでいないため、読み取るデータは含まれていません。
この場合、メソッドのchannel.read()
実行時間が長すぎて、データが返されません。
この状況をどのように処理しますか?
ありがとう。
java - Java nio サーバー クライアント 非同期
java nio とセレクターを使って自分でサーバーを作りました。必要に応じて、クライアントから直接データと回答を受け取ることができます。
しかし今は、データを処理し、いつでも各クライアントにデータを送信するスレッドが必要です。
では、どうすればそれを行うことができますか?また、各クライアントにデータを書き込むためにすべてのチャネルをメモリに保持する方法は?
必要に応じて、Java nio を使用してコードの一部を投稿できます。
java - SocketChannelクライアントコードを使用するJavaライブラリはありますか?
いくつかのオープンソースのJavaネットワーキングライブラリ(jdbcドライバー、apache commons netなど)を調べましたが、単純なユースケース以外でSocketChannelを使用するライブラリをまだ見つけていません(mysqlのjdbcコネクタのV3はsocketchannelを使用していました)ただし、新しいバージョンではjn.Socketを使用します)。
私はクライアントコードライブラリにのみ興味があります。(接続するライブラリ、リッスンしないライブラリ)。
参考までに、Javaソケット(クライアントのみ)の抽象化レイヤーを実装しています。SocketChannelを機能させるには、いくつかのユースケースが必要です。これまでのところ、私が見た(クライアント)ライブラリは、SocketChannelsから離れて、java 1.0 Socketベースの実装に戻っているようです。おそらく、SSLの使用に関心があるためです(わからない)。
だから、本当の問題は、SocketChannel&coをサポートする必要があるのかということです。(プラットフォームはとにかく着信接続をサポートしていないため、クライアント側のライブラリの場合...まだ。)
同様に、DatagramChannelにも興味があります。(同じ質問ですが、このクラスをわざわざサポートする必要がありますか?)
他にどこを見るべきかアイデアはありますか?
java - クライアントがすでに開いているときに ServerSocketChannel が再起動された場合の接続の処理
私の SwingWorkerは、ユーザーが [接続] ボタンをクリックすると、新しいものdoInBackground()
を作成 (および登録) します。OP_ACCEPT
ServerSocketChannel
クライアントの場合isAcceptable()
、 は を にSwingWorker
登録SocketChannel
しOP_READ
ます。
ユーザーが「切断」ボタンをクリックすると、 はSwingWorker
closes()ServerSocketChannel
およびselector()
. ただし、クライアントはまだ開いています。
問題: ユーザーが [接続] をもう一度クリックすると、クライアントがまだOP_READ
モードにあり、ServerSocketChannel
.
これを克服する方法はありますか?ServerSocketChannel
再起動には、クライアントも再起動する必要がありますか?
java - TCPソケットからByteBufferにデータを取得する方法
ソケットからByteBufferに着信データを取得する必要がありますが、その方法がわかりません。私はこの分野に不慣れであるため、開始するための最良の方法がわかりません。私は次のことを見つけましたが、データを一列に並べるため、それは私が望むものではありませんが、他の目的のためにすべてのデータをバイトバッファーに入れる必要があります。