問題タブ [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.

0 投票する
4 に答える
9363 参照

java - SSL とソケットチャネル

理想的には、単純なSSLSocketChannel.

通常のメッセージを読み書きするコンポーネントを既に持っていますがSocketChannel、これらの接続の一部では、ネットワーク上で SSL を使用する必要があります。ただし、これらの接続に対する操作は同じです。

SSLSocketChannel無料の実装(適切なセレクターを使用)または同様のものを知っている人はいますか?私はこれを見つけましが、ベンダーが SUN ではないため、セレクターはそれを受け入れません。

単純なオブジェクトを介したネットワーク データの挿入と取得から read_from/writing_to ネット ロジックを切り離して、腹を立てSSLEngineずに a を使用するようにしていますが、それを正しく実装するのは本当に難しいです。 SSLプロトコルの内部...

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

java - Java SocketChannel 私のバイトを食べる

Tomcat でメッセージを送受信するために、リモート サーバーへの SocketChannel を作成しました。リモート コンピューターからメッセージを受信するために、タスク専用のスレッドを使用しました (このスレッドのみがソケットから読み取ります)。

SocketChannel でいくつかのバイトが受信されると (新しいデータのために非ブロッキング モードで SocketChannel をポーリングし続けます)、最初に 4 バイトを読み取って次のメッセージの長さを取得し、次に SocketChannel から x バイトを割り当てて読み取ります。次に、デコードしてメッセージに再構築します。

以下は、受信スレッドのコードです。

SocketChannel から受信した最初のバイトは問題なく、メッセージのデコードに成功しました。しかし、次に SocketChannel から読み取ると、ソケットが約 100 バイト先にスキップしたため、間違ったバイトが読み取られて長さとして解釈され、すべてが破損しました。

コードの何が問題になっていますか? SocketChannel から読み取っているスレッドは他にありません。

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

java - Java セレクター/SocketChannel の問題

マルチプレイヤー ゲームで問題が発生しています。現在、サーバーに現在のレベルをクライアントに送信させようとしています。サーバーは間違いなくデータを送信していますが、クライアント アプリケーションには到達しません。

クライアントコード:

サーバーコード:

クライアントに到達するのは、バイト 0x01 (レベル変更を通知する) だけです。

前もって感謝します。

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

java - Java ServerSocketChannel SocketChannel (コールバック)

私はJavaを学ぼうとしています。シンプルなネットワーク コネクト 4 ゲームとチャット機能を実装したいと考えています。

私は自分のネットワークロジックをブロックしないようにしたいので、多くの研究の結果、自分のニーズを再評価した後、SocketChannel が自分のものであることがわかりました。

まだ意味を成していないのは、SocketChannels に CallBack 関数がないことです。C# で見られるように。

今回の私の質問は、受信したデータをチャットまたはゲーム フォーム (JFrame) に配信するにはどうすればよいですか?

いくつかのガイダンスは大歓迎です。

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

java - SocketChannel のタイムアウトが機能しない

SocketChannelを使用し、その読み取り/書き込みメソッドにタイムアウトを設定したいと考えています。次のように自分を所有するソケットのタイムアウトを設定しようとしましたSocketChannel:

しかし、それはうまくいきません。他の解決策はありますか?

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

java - 非ブロッキングサーバーで受信したデータの検証

javas NIOパッケージを使用してノンブロッキングサーバーを構築していますが、受信したデータの検証についていくつか質問があります。

ソケットチャネルでreadを呼び出すと、(ドキュメントに従って)読み取っているバイトバッファをいっぱいにしようとすることに気づきました。クライアントからサーバーに10バイトを送信すると、サーバーはそれらの10バイトをバイトバッファーに読み込み、バイトバッファーの残りのバイトはゼロのままになり、読み取り操作から返される数値はクライアントが10バイトしか書き込んでいないのに、バイトバッファのサイズ。

私が理解しようとしているのは、サーバーがソケットチャネルから読み取るときにクライアントがサーバーに送信したバイト数だけを取得する方法があるかどうかです(上記の場合、1024ではなく10)。

それがうまくいかない場合は、クライアントから実際に受信したすべてのデータを、「命令セットヘッダー」などと組み合わせて区切り文字を使用することで、バイトバッファに格納されているこの「過剰な」データから分離できることを知っていますが、そうではないようですこのように存在するはずなので、明らかな何かが欠けているだけなのか、それともこれができない低レベルの理由があるのか​​疑問に思う必要があります。

ありがとう :)

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

java - Java SocketChannelは切断を検出しませんか?

セレクターを使用してソケットを実行しています。ソケットがサーバーに接続されているかどうかを確認しようとしています。

そしてそれは常にtrueを返します。コンピューターで空港(インターネット接続)をオフにしましたが、ソケットが接続されているかどうかを確認しても、trueが返されます。なぜですか?3秒ごとにサーバーにデータを書き込もうとしましたが、それでもソケットの状態が切断された状態に変わりません。

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

java - Java SocketChannel への信頼できる書き込み

Java SocketChannel について質問があります。

ブロッキング モードで開いているソケット チャネルがあるとします。write(ByteBuffer)メソッドを呼び出した後、書き込まれたバイト数を表す整数を取得します。javadoc は次のように述べてい ます。 「戻り値: 書き込まれたバイト数、おそらくゼロ」

しかし、これは正確にはどういう意味ですか?これは、バイト数が実際にクライアントに配信されたことを意味しますか (サーバーが受信したバイト数を明らかにする tcp ack を送信者が受信したように)、またはバイト数が tcp スタックに書き込まれたことを意味しますか? ? (そのため、一部のバイトがまだ待機している可能性があります (ネットワーク カード バッファなど)。

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

android - Android の SocketChannel

Android の SocketChannels について質問があります。これは私のコードです:

このコードは Java では機能しますが、Android では機能しません。私は常に IOException を取得します。最初の問題は最初の行でした。ソケットを開くためのアクセス許可を追加する必要がありました。最初の行は機能するようになりましたが、2 行目は機能しません。私は常に IOException を取得します。

助言がありますか?

0 投票する
4 に答える
3092 参照

java - Selector.select()は無限ループを開始します

最小限のJMSプロバイダーがあり、UDPを介してトピックメッセージを送信し、TCPを介してメッセージをキューに入れます。単一のセレクターを使用して、UDPおよびTCP選択キーを処理します(SocketChannelsとDatagramChannelsの両方を登録します)。

私の問題は、UDPパケットを送受信するだけですべてがうまくいくが、TCPソケットへの書き込みを開始するとすぐに(Selector.wakeup()を使用してセレクターに実際の書き込みを行わせる)、セレクターが無限ループに入るということです。ループし、空の選択キーセットを返し、100%のCPUを消費します。

メインループのコード(やや簡略化)は次のとおりです。

また、UDP送信の場合(TCP送信も同様です):

それで、ここで何が問題になっていますか?UDPパケットとTCPパケットを処理するために2つの異なるセレクターを使用する必要がありますか?