問題タブ [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 - Socketchannelを使用してパラメータ値をサーバーに送信する方法は?
私はSocketChannelを使用して、Android アプリケーションでクライアントからサーバーにファイルを送信しています。
問題なく動作しています。しかし、ファイル名もサーバーに送信する必要があります。HttpPost のように Socketchannel にリクエスト パラメータを設定することはできますか?
多くのフォーラムを検索してみましたが、うまくいきませんでした。SocketChannel について深い知識を持っている人がいる場合は、答えを教えてください。
前もって感謝します。
java - Java: SocketChannel を再利用する方法
サーバーへの1回の接続で2つのリクエストを行う必要があります。このタスクに「SocketChannel」を使用していますが、必要なことを実行できません。
出力には、最初のリクエストの結果のみが表示されます。例外はスローされません。
私が使用するSocket
と、同じことがわかります。
SocketChannel 接続を再利用するには?
java - Java SocketChannel : wrap-flip-write が機能しないのに、wrap-write が機能するのはなぜですか?
SocketChannel
着信データを待機しているサーバーにJava が接続されているとします。
そして、以下のようにリクエストを送信します。
上記のコードは、チャネルにバイトを書き込まないこと0
を意味します。
しかし、行を削除すると、buffer.flip()
正常に機能し、データが送信されます。
どうしてこれなの ?!
java - ストリーム名が十分に大きい場合、red5 RTMPClient はストリームを公開しません
ビデオファイルから wowza メディアサーバーにロードされたストリームを発行する Red5 クライアント実装があります。問題は、ストリーム名が大きすぎる場合 (約 90 シンボルを超える場合)、クライアントがそれを公開せず、サイレントに失敗することです。クライアントから期待される他のすべてのアクションが実行されます。サーバーに接続し、ストリームを作成します。ただし、ストリームを公開することはありません。対応する RTMP メッセージが表示されず、結果の反応が wowza のログに表示されません。
クライアントのデバッグを試み、SocketChannel への書き込みが開始されるまで実行を追跡しました。短い名前のストリーム (公開しても問題ありません) を実行する場合と、「公開する」RTMP コマンドが送信されない長い名前のストリームを実行する場合は、すべて同じです。
質問は次のとおりです。
調子はどう?
例外がスローされずに SocketChannel にいくつかのバイトを書き込んだ場合、対応するメッセージが送信されたことを保証しますか?
例外がスローされずに SocketChannel にいくつかのバイトを書き込んだ場合、バイトが実際にどこかに書き込まれたかどうかを OS (私の場合は MACOS) で確認できますか? 私は、WireShark によって、このデータが送信されなかったことを知っています。
更新...さらに奇妙なことに、「大きな」パケットを送信した後、小さなパケットを送信しても役に立ちません。より長いパケットがソケットに送信された後は、パケットを送信できません。
java - セレクターのアイドル チャンネルを見つけてキャンセルする方法は?
読み取り操作Selector
で複数のタイムアウトを選択する Java NIOがあるとします。SocketChannels
特定の時間アイドル状態になった場合、チャネルをキャンセルして閉じる必要があるため、selector.select(TIMEOUT)
このメソッドを使用しています。
しかし、非常にアクティブなチャネルがいくつかある場合、これは機能しません。これらのアクティブなチャネルはselect
タイムアウトすることはありませんが、他のすべてのチャネルはアイドル状態になる可能性があります...
これに対する素朴な解決策は次のとおりです(ここでも言及されています):
メソッド
SelectionKey
を使用して、アクティビティの最後の時刻を各チャネルに添付します。key.attach(object)
選択が成功するたびに、すべての準備完了キーのアクティビティ時間を更新します。次に、すべてのキーを繰り返し処理し、特定のしきい値を超えてアイドル状態になっているキーを見つけます。
select
アクティブなチャネルによって が非常に頻繁に起動し、そのたびにキー セット全体が繰り返されるため、これは非常に非効率的です。
この問題を解決するためのより良い (より効率的な) 方法はありますか?
java - SocketChannel接続をブロックするとfalseが返されますか?
SocketChannel のドキュメントを読むと、ブロックしている SocketChannel connect() 呼び出しが true を返すか、例外をスローするだけであることが明らかです。つまり、ノンブロッキング モードでのみ false を返すことができます。それは正しいですか、それとも何かを見落としている/読み間違えていますか?
channel.configureBlocking(true) が返され、チャネルがブロッキングモードにならない可能性はありますか? configureBlocking(true) が (メソッド呼び出しが戻る前に) チャネルをブロック モードにすることができなかった場合、例外がスローされると予想されます。あれは正しいですか?
最後に、次のコードが接続に失敗しても TRUE を返す方法はありますか? (コードは、接続が成功するかどうかのみをテストします。チャネルでは何もしないため、すぐに閉じます):
ありがとう!
java - msgpack-java & java.nio.SocketChannel
msgpack を使用してノンブロッキング IO (ネットワーク ソケット) をセットアップする方法を理解するのに苦労しています。msgpack はByteBuffer
非常に簡単に生成できるため、書き込み部分は簡単ですが、MessagePack オブジェクトへのノンブロッキング読み取りを行う方法がわかりません。MessagePack.read()
3 つの主要なオプションがあるのを見てください... read(InputStream in)
、read(byte[] b)
およびread(ByteBuffer b)
. これらはすべてブロック操作です。
ノンブロッキング トランスポートに移動しようとしている理由は、サーバーが何百もの同時長寿命接続を必要とする可能性があるためです。
助言がありますか?私のグーグルでは、ほとんどの人がブロッキングIOでmsgpackを使用しているようです。私が考えることができる唯一のオプションは
java - SocketChannel Android を使用して WebSocket に接続する
Autobahn websocket ライブラリで実装された websocket サーバー、サーバー アプリ、および android アプリに接続する android アプリを作成しました。
サーバーと正常に接続してメッセージを交換できます。しかし、しばらくすると(20〜30分後)Androidアプリがサーバーとの通信を停止します(サーバーにメッセージを送信できません)。logcat では、サーバーにメッセージを送信できない場合でも、アプリは引き続き websocket に接続します。
Autobahn ライブラリのソース コードを調べたところ、 java.nio.channels.SocketChannelを使用して websocket に接続していることがわかりました。SocketChannels の使用に問題はありますか? (ここAndroid - How to keep connection with server for long timeから同様の問題を見つけました)