問題タブ [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.
android - Android - サーバーとの接続を長時間維持する方法
SocketChannel を使用して Android 用のチャット アプリケーションを作成しました。サーバーと正常に接続し、すべての機能が動作します。しかし、ログインしてからかなり時間がたってから (約 2 ~ 3 時間)、再度チャット メッセージを送信しようとすると失敗します。ログ ファイルでは、SocketChannel、セレクターがまだ開いていて、サーバーに接続しています。メッセージは既に正常に書き込まれています。どうしたの?私は何が欠けていますか?
よろしくお願いします。
java - 1 つの SocketChannel のみを介して複数のメッセージを送信する
このチュートリアルを読んだ後: http://rox-xmlrpc.sourceforge.net/niotut/ (これはノンブロッキング サーバーとクライアントの記述に関するものであり、NIO 部分を読み、SSL 部分をスキップしました)、今は自分自身を書き直そうとしています。クライアントですが、クライアント コードを編集しようとすると問題が発生します。
最初に、チュートリアルのクライアント コードをご覧いただきたいと思います。これには 2 つのファイルが含まれています。
RspHandler.java : http://rox-xmlrpc.sourceforge.net/niotut/src/RspHandler.java
NIOClient.java : http://rox-xmlrpc.sourceforge.net/niotut/src/NioClient.java
main
しかし、私は以下のように私の問題を説明するために機能で NIOClient.java を少し編集しました:
私の編集したクライアントは、サーバーにメッセージを送信し、サーバーからエコーされたメッセージを受信するという単純なことを行うだけです。もちろん、上記のコードはうまく機能します。2 つのメッセージを送信し、それらを正しく受信しました。
しかし、上記のクライアントで私が望んでいないことは、次のとおりです。send
関数は次のコードを呼び出します。
これは、すべての特徴的なメッセージがすべての特徴的な新しい SocketChannel に対応することを意味しますが、多くのメッセージを送信するために 1 つの SocketChannel のみを使用したいので、次のコードのようにクライアントを変更します。
しかし、上記のクライアントを実行した後、最初のメッセージのみが送受信され、デバッグ後に 2 番目のメッセージが送信されていないことがわかりますが、その理由と解決方法はわかりません。
アンサー知ってる人いますか?
私の非常に長い質問を読んでくれてありがとう。
android - Android: Wifi ネットワークでピアを見つける
特定のポートでアプリケーションをホストしているwifiネットワークにログインしている他のデバイスを検索する方法を見つけようとしています。
これらの他のデバイスのアドレスやホストしているポートを知らなくても、これらのデバイスの存在を検出するにはどうすればよいでしょうか?
発見されたら、デバイスに接続し、SocketChannels を使用してクライアント サーバー接続を確立できるはずです。
注: このアプリケーションは、ICS 以前の Android デバイスで動作することを想定しています。したがって、Wifi-Direct はありません。
java - 1つのSocketChannelのみを介して非ブロッキングクライアントと非ブロッキングサーバー間で通信する方法
私は要件を備えた非ブロッキングクライアントと非ブロッキングサーバーを作成しようとしています:
- サーバーはクライアントをリッスンし、受信したものをクライアントに送り返します。
- クライアントはいつでもサーバーにメッセージを送信でき、何度も送信できますが、SocketChannelは1つだけです。
私はこのチュートリアルを読みました:http://rox-xmlrpc.sourceforge.net/niotut/index.html、そしてそれはこれらのステップのようなサーバーを実装します:
- セレクターを初期化する
- クライアントからの受け入れ可能なSelectionKeyを待ちます
- 次に、読み取り可能なSelectionKeyを待ち、そこからデータを読み取ります(
socketChannel.read
戻っ-1
たら、socketChannelを閉じます) - その後、書き込み可能なSelectionKeyによってクライアントに送り返します
このチュートリアルも見てみました:https ://forums.oracle.com/forums/thread.jspa?threadID = 1145909&tstart = 2040 、しかし私には理解するのが難しすぎます
そこで、ROXのチュートリアルに基づいて独自のコードを書き直しました。これが私のコードhttp://www.mediafire.com?o30yvtp5kqpya8bです(これはほとんどROXのチュートリアルのコードに基づいています)。ここにすべてのコードを投稿するのは難しいので、プロジェクトをmediafireにアップロードしてダウンロードできるようにします。ダウンロードして、Eclipseにインポートしてコードを簡単に表示できます。
次のコマンドを実行できます:MyServer.java
パッケージ内server
、次にMyClent.java
パッケージ内client_test
(パッケージは気にしないでくださいclient
)
サーバーとクライアントを実行した後、サーバーはクライアントから最初のメッセージを受信できることがわかりますが、2つのメッセージを受信する必要があります。実装に問題があることは知っていますが、その理由と修正方法がわかりません。
私のコードの修正や私の要件の解決策についての提案はありがたいです、ありがとうございました。
わかりました。ここにコードの重要な部分を投稿します。
私の顧客:
MyClient.java
MyResponseHandler.java
MyServer.java
さらにコードを表示したい場合は、zipファイルをダウンロードできます。また、サーバーとクライアントを実行すると、デバッグの結果は次のようになります。
サーバ
クライアント
java - Javaで接続が確立されているかどうかを確認する方法は?
Androidで2つのエミュレーター間にソケットチャネルを構築しようとしました。次のコードを書きました。
(ip、port)で別のエミュレーターを起動していないことに注意してください。つまり、接続は常に失敗します。上記のコードのデバッグを開始すると、
次に、catch ブロックにジャンプします。
catch ブロック内の他のすべての行は実行されず、返されたときにクライアントは null ではありません。では、接続が正常に確立されたかどうかをどのように判断できますか?
private - PubNub のベスト プラクティス: プライベート ルームを管理するには?
私は pubnub を学んでおり、そのドキュメントを読んでいますが、マルチルーム チャット ボックスを管理する方法が見つかりません。
デフォルトでは、チャンネルは誰でも聞くことができます。購読して公開するのは簡単です。
私が望んでいるのは、メインのパブリック ルーム (これまでのところ非常に良い) を持つことですが、他のユーザーに読まれるリスクなしに、誰でも他の誰とでもプライベートに話すことができる必要があります。
これらの動的な部屋にはタブが付けられ、ユーザーはある部屋から別の部屋に移動できる必要があります。
もう 1 つの要件は、誰かとプライベートに話しても、サブスクライブしている他のルームから追い出されないことです (チャット中に別のルームに新しいメッセージが投稿されたことを通知することはできます)。
これを達成するためのベストプラクティスは何ですか?
- 別のチャネル (動的に作成) を使用しますか?
- 1 つのチャネルを使用して、ステータス、疑似ルーム ID、または主人公に従ってメッセージをフィルタリングしますか?
- 多重化 (1 つのソケットのみ) を使用しますか?
ドキュメントは単一の部屋での基本的なシナリオのみを説明しており、これについてはインターネット上には何もないため、これを達成するための最良の方法を知る必要があります.
ありがとうございました。
PS: PubNub が一度に 2 つ以上のチャネルを推奨していないことは知っています (これについての説明を見つけるのに苦労していますが)。
PPS: 私は socket.io で punbub を使用しています
java - put メソッドの呼び出し時に ConcurrentHashMap が null 以外のキーと値のペアを挿入しない
ConcurrentHashMap を使用して、SocketChannel で処理しているタスクをキャッシュしています。StreamTask は、クライアント サーバー通信中にラウンド トリップしきい値が経過した場合に自身を再スケジュールするために使用される Runnable であるため、時間が経過するとキャッシュから自身を削除します。さらに、StreamWriteTask スレッドはそれをキャッシュに置き、StreaReadTask はそれを削除しようとします。
問題は、「processingCache.put()」を呼び出すと、常にマップに追加されるとは限らないことです。
java - 複数のOPコード用のJavaSocketChannelregister()が選択されることはありません
複数のクライアントを受け入れることができるセレクターベースのシステムをJavaで構築しました。OP_ACCEPTの下に登録されたServerSocketChannelがあり、着信接続をaccept()し、結果のSocketChannelをセレクターに再度登録します。これがそのビットです:
OP_READに新しいSocketChannelを登録すると、これは正常に機能します。isReadable()のチェックが成功し、データを読み取ります。これがそのビットです:
ただし、ソケットチャネルをOP_READ | OP_WRITEに登録すると、何も起こりません。私の知る限り、セレクターはチャネルが読み取り可能()または書き込み可能()であることを検出しません。唯一の変更は、書き込み許可のためにチャネルを登録することです。
なぜこれが起こるのか、何か考えはありますか?
編集-完成のために、ここにいくつかのクライアントコードがあります:
(クライアントはサーバーをOP_READ | OP_WRITEに登録します)
java - チャネルを介してクライアントからコンテンツを読み取り中に java.nio.channels.IllegalBlockingModeException が発生しました
NIO に非常に慣れていないチャット アプリケーションを構築していますjava.nio.channels.IllegalBlockingModeException
。ここで私を助けてください、例外が発生するコードです。例外発生while (rbc.read(b) != -1)
中PrintRequest class
私のサーバーコード:
クライアント側:
java - JavaSocketChannelが不明な長さのメッセージを読み取りました
ソケットから1024バイトのデータを読み取ります。この場合、すべてのメッセージが結合され、最後のメッセージが完全に届きません。メッセージセパレータ'|'の前のバッファにデータを読み込むにはどうすればよいですか??各メッセージを個別に受信したい。