問題タブ [tcpclient]
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.
c# - TCPClient で複数のコマンドを送信する
私は使用しようとしています
クラスでLIST
、RETR
、STOR
、 のようなコマンドを送信するたびに、コマンドを実行して応答を取得する特定の時間だけ TCPClient をロックしていました。
実行中に他のコマンドを送信すると、その tcpclient インスタンスを再度ロックできません。
実行中に他のコマンドを送信するにはどうすればよいですか。すべてのコマンドで、変更できない TCPClient をロックする必要があります。
java - 複数のJavaHttpConnectionsを同じ宛先に対して開いたままにする方法
HttpURLConnection APIを使用して、同じプロバイダーに対してREST APIを頻繁に呼び出しています(一種の集約ユースケース)。5つの接続のプールを常にプロバイダーホストに対して開いたままにします(常に同じIP)。
適切な解決策は何ですか?これが私たちが試したことです:
この時点で、BufferedReaderがバイトを返さなくなるまで入力ストリームを読み取ります。プロバイダーへの基盤となる接続を再利用する場合は、その後どうしますか?入力ストリームが完全に読み取られると、接続がプールに追加されるという印象を受けました。
このように数週間機能していましたが、今日はこの例外の生成が停止しました。java.net.SocketException: Too many open files
lsof
(を実行することにより)次
のようなCLOSE_WAIT状態のソケットが多数見つかりました。java 1814 root 97u IPv6 844702 TCP colinux:58517->123.123.254.205:www (CLOSE_WAIT)
conn.getInputStream()。close()またはconn.disconnect()のいずれかが接続を完全に閉じて、プールから削除しませんか?
tcp - アイドル状態の TCP 接続が閉じられる時間を決定するタイムアウト値はどれですか?
接続が確立された後、両側に通信がない場合、どのタイムアウト値がアイドル接続を閉じるかを決定しますか?
.net - NetworkStream.Read 遅延 .Net
TcpClient から継承するクラスがあります。そのクラスには、応答を処理するメソッドがあります。そのメソッドで、MyBase.GetStream を使用して NetworkStream を取得し、Read を呼び出します。
ブロックを読み取るための最初の呼び出しが長すぎることを除いて、これは正常に機能します。そして、長すぎるということは、ソケットが大量のデータを受信したにもかかわらず、任意の制限に達するまでそれを読み取らないことを意味します。パケット スニファ WireShark を使用して、大量のデータを受信したことがわかります。
受信バッファーを少量に設定しましたが、非常に少量 (ほんの数バイトなど) は役に立ちません。read メソッドに渡すバッファ バイト配列でも同じことを行いましたが、それでも遅延が発生します。
または別の言い方をすれば。私は600kをダウンロードしています。ダウンロードには 5 秒かかります (サーバーへの接続が 100k/秒を少し超える場合、これは理にかなっています)。最初の Read 呼び出しには 2 ~ 3 秒かかり、256 バイトしか使用できないことがわかります (256 は受信バッファーであり、読み込んだ配列のサイズです)。次に、魔法のように、残りの数十万バイトは、わずか数プロセスティックで 256 バイトのチャンクとして読み取ることができます。パケット スニファを使用すると、最初の 2 ~ 3 秒間に、ソケットが 256 バイトをはるかに超える量を受信したことがわかりました。私の接続は、3 秒間は 0.25k/秒ではなく、2 秒間は 400k ではありませんでした。
入ってくるバイトをソケットから取得するにはどうすればよいですか?
.net - もう一方の端が.NETで閉じられているときにTcpClientを閉じる方法は?
TcpClients を処理するクラスがあります。クラスがすべきことは次のとおりです。
他のクライアントがいつリクエストを送信するかわからないため、タイムアウトを設定して読み取りを行うことはできません。
このアプローチの問題は、クライアントが Close() へのリモート呼び出しをいつ行ったかがわからないことです。
この問題を解決する方法はありますか?
multithreading - 読み取り時のTcpClientおよびStreamReaderブロック
これが私の状況です:
チャットサーバーに接続するためのチャットクライアントを作成しています。TcpClientを使用して接続を作成し、そこからNetworkStreamオブジェクトを取得します。StreamReaderとStreamWriterを使用して、データの読み取りと書き込みを行っています。
これが私の読み取りがどのように見えるかです:
それはうまく機能し、ダンディです。私のメインプログラムでは、このReadメソッドを継続的に呼び出してデータがあるかどうかを確認するスレッドを作成します。例を以下に示します。
これは問題なく機能します。アプリケーションをシャットダウンしたいときに問題が発生します。UIからシャットダウンコマンドを受け取り、リスニングスレッドにリスニングを停止するように指示します(つまり、この読み取り関数の呼び出しを停止します)。Joinを呼び出し、この子スレッドの実行が停止するのを待ちます。そのようです:
問題は、実行が停止しないことです。コードにステップインしましたが、Read()メソッドがブロックしているため、リスニングスレッドがブロックしています。Read()はそこに座っているだけで、戻りません。したがって、スレッドがその1ミリ秒スリープしてから中断されることはありません。
十分な時間放置すると、別のパケットを取得してスレッドをスリープ状態にする機会が得られると確信しています(アクティブなチャットルームの場合、またはサーバーからpingを取得する場合)。しかし、私はそれに依存したくありません。ユーザーがシャットダウンと言ったら、シャットダウンしたいです!!
私が見つけた代替案の1つは、NetworkStreamのDataAvailableメソッドを使用して、StreamReader.Read()を呼び出す前にチェックできるようにすることです。信頼性が低く、サーバーからパケットを読み取るときにデータが失われたため、これは機能しませんでした。(そのため、正しくログインできなかったなど)
このスレッドを正常にシャットダウンする方法についてのアイデアはありますか?リスニングスレッドでAbort()を呼び出すのは嫌です...
c# - リモートホストが接続を閉じたことを示す NetworkStream.Read の代替?
クラスを使用した TCP/IP 接続の処理に関して、メソッドが 0 を返すのをTcpClient
待つ以外に、リモート ホストが接続を閉じたかどうかをチェックする代替手段はありますか?NetworkStream.Read
c# - C# の TCPClient / Socket で使用する発信 IP アドレスを指定する
ネットワーク アダプタに複数の IP アドレスが割り当てられたサーバーがあります。
そのサーバーには、TCPClient 経由で別のサーバー アプリに接続するためのクライアント アプリがあります。すべての発信通信でサーバーのデフォルト IP アドレスが使用されていますが、この 1 つのアプリケーションでは、発信通信を別のローカル IP アドレスで送信したいと考えています。
通信するときに、別のローカルに割り当てられた IP を指定することはできますか?
リモートサーバーアプリに別のIPからのものであると思わせて、ファイアウォールなどを通過させようとしています....
前もって感謝します
c# - すでにサーバーに接続している場合。次に、すでに接続されているという例外を表示する方法
ユーザーが入力を入力せずに接続をクリックした場合、入力が必要であることを示す例外を追加する方法は? ユーザーが名前、IP、およびポートを入力せずに接続ボタンをクリックすると、メッセージ ボックスが表示されます。[解決済み]