0

私は Android フォン用の MMO を作成し、TCP/IP ソケットを備えた Java サーバーを使用しています。通常はすべて正常に動作しますが、クライアントがネットワークにログオンしたりオフにしたりして約 1 日経過すると、クライアントが接続されていなくても、非常に遅延が発生します。NETSTAT は長引く接続を示していませんが、明らかに何かひどく間違っていることが起こっています。

完全に再起動すると、魔法のようにすべてが再びうまくいきますが、これは長期的には支持できる解決策ではありません. これは私の切断方法がどのように見えるかです(両端で):

    public final void disconnect()
{
    Alive = false;
    Log.write("Disconnecting " + _socket.getRemoteSocketAddress());
    try
    {
        _socket.shutdownInput();
    }
    catch (final Exception e)
    {
        Log.write(e);
    }
    try
    {
        _socket.shutdownOutput();
    }
    catch (final Exception e)
    {
        Log.write(e);
    }
    try
    {
        _input.close();
    }
    catch (final Exception e)
    {
        Log.write(e);
    }
    try
    {
        _output.close();
    }
    catch (final Exception e)
    {
        Log.write(e);
    }
    try
    {
        _socket.close();
    }
    catch (final Exception e)
    {
        Log.write(e);
    }
}

_input と _output は、ソケットから生成された BufferedInputStream と BufferedOutputStream です。ドキュメントによると、shutdownInput() と shutdownOutput() を呼び出す必要はありませんが、これでできることはすべて投げています。

デフォルト設定でソケットをインスタンス化します。soLinger、KeepAlive、noDelay などには触れていません。送受信にタイムアウトを設定していません。WireShark を使用してみましたが、NETSTAT と同じように異常はありません。

私はこれについての答えをかなり切望しています。私はこのプロジェクトに多大な努力を払ってきましたが、Java のデフォルトの TCP 実装に隠された重大な欠陥のように見えることに不満を感じています。

4

2 に答える 2

2

shutdownInput() と shutdownOutput() を取り除き、BufferedOutputStream のクローズを除くすべてのクローズと、ベルトとブレースとしての最終ブロックでのソケット自体の後続のクローズを取り除きます。出力ストリームの前に他のすべてをシャットダウンして閉じているため、フラッシュが妨げられています。出力ストリームを閉じると、それがフラッシュされ、ソケットが閉じられます。それだけです。

于 2010-12-04T00:40:02.497 に答える
0

OP ここでは、元の投稿にコメントできません。

  • サーバー プロセスを再起動しても、問題は解決しないようです。サーバーを完全にシャットダウンした後でも、ネットワークは非常に「遅延」したままです。

  • 「遅延」とは、アップトラフィックとダウントラフィックの両方で接続が非常に遅くなることを意味します。ウェブサイトをロードしたり、FTP にアップロードしたりしようとすると、14.4k モデム (15mbs ファイバー) を使用しているように、非常に遅くなります。この状態では、インターネット速度テストも機能しません。Web サイトが最終的に読み込まれると、ファイルが見つからないというエラーが表示されます。

  • これらはすべて、再起動後に即座に解消されますが、再起動後にのみ解消されます。

  • EJP が提案したように切断方法を変更しましたが、問題は解決しません。

  • サーバーは、Windows 7 インストール、最新バージョンの Java / Java SDK で実行されます。サーバーには 16 GB の RAM がありますが、JVM が完全に使用できるように適切に割り当てていない可能性があります。ストレイ スレッドまたはプロセスは存在しないようです。JVISUALVMが何を言っているのか見てみましょう。– jysend 13 分前

  • JVISUALVM に異常はありません -- 10MB のヒープ、50% の CPU 使用率、3160 個のオブジェクト (予想)、437 個中 27 個のライブ スレッドが開始されました。サーバーは約 18 時間稼働しています。CNN のフロント ページのロードには約 1 分かかり、私が使用する通常の速度テスト (最初のヒット グーグル速度テスト) では、ページをロードすることさえできません。NETSTAT は、残留接続を示していません。最新のウイルス対策をすべて実行しました。サーバーは過去に問題なく 24 時間年中無休で実行されていました。これが発生し始めたのは、この Java サーバーを実行し始めたときだけです。

于 2010-12-08T02:03:15.447 に答える