Javaソースコードの分析とインタビューの質問-ServerSocketソースコードとインタビューの質問

関連するブログ、ムークラス参照列この一連のJavaソースコードとシステムメーカーは簡潔Zhentiインタビュアー
この列の下には、GitHubのアドレスです:
ソースは解決:https://github.com/luanqiu/java8
記事デモ:HTTPS:// GitHubの。 com / luanqiu / java8_demo
クラスメートは必要に応じてそれを見ることができます)

Javaソースコードの分析とインタビューの質問-ServerSocketソースコードとインタビューの質問

入門フレーズ
我々はソケットを学んだ前のセクション、私たちはサーバソケットAPIを見てみましょう。この記事では:ServerSocketのは、この記事の研究が完了した後、私たちは、一緒に顧客サービスとサーバー側のソケットのServerSocketを入れて、実際のネットワーク通信を行うことができます今デモ。

タイプ1属性

ServerSocketの主な機能は、サーバー側のソケットとして機能し、クライアントソケットから送信された情報を受け取り、応答をクライアントに返すことです。そのプロパティは、次のように非常にシンプルです。

private boolean created = false;// 已创建
private boolean bound = false;// 绑定
private boolean closed = false;// 已关闭
// 底层的功能都依靠 SocketImpl 来实现
private SocketImpl impl;

ServerSocketとSocketは、最下層がSocketImplの機能に依存し、SocketImplの基本機能の実現は、基本的にネイティブメソッドによって実装されます。

2初期化

初期化は、パラメーターなしのコンストラクターとパラメーター化されたコンストラクターの2つのカテゴリに分類できます。

  1. パラメーターなしのコンストラクターは比較的単純で、SocketImplをSocksSocketImplクラスとして指定するだけです。
  2. パラメトリックコンストラクターの初期化にはいくつかの形式があります。パラメーターが最も多いコンストラクターのソースコードを見てみましょう。
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
    // 默认是 SocksSocketImpl 实现
    setImpl();
    // 端口必须大于 0,小于 65535
    if (port < 0 || port > 0xFFFF)
        throw new IllegalArgumentException(
                   "Port value out of range: " + port);
    // 最大可连接数如果小于1,那么采取默认的 50
    if (backlog < 1)
      backlog = 50;
    try {
        // 底层 navtive 方法
        bind(new InetSocketAddress(bindAddr, port), backlog);
    } catch(SecurityException e) {
        close();
        throw e;
    } catch(IOException e) {
        close();
        throw e;
    }
}

入力ポートは、ServerSocketがバインドする必要があるローカルポートを指します。

バックログの入力は、クライアント接続キューを受け入れるサーバーの最大長を参照します。これは、クライアント接続の数を制限しないことに注意してください。JDK8バージョンで実験を行いました。サーバーバックログを1、サーバーの処理速度を遅くします。サーバーから同時要求が来た場合、それは接続を拒否する2番目の要求ではありません。実際の作業では、バックログを使用してクライアント接続の数を制限しないことをお勧めします。

もう1つの注意点は、バックログが1未満の場合、バックログはデフォルトの50に設定されることです。

参照へのInetAddress IPアドレスを表します。

3バインド

bindメソッドの主な機能は、ServerSocketをローカルポートにバインドすることです。このメソッドは、パラメーターなしのコンストラクターでServerSocketを初期化する場合にのみ使用されます。パラメーター化されたコンストラクターが使用される場合、初期化中に既にバインドされています。ローカルポートはアップしています。

パラメーターなしのコンストラクターでは、通常、次のように使用します。

// 进行初始化
ServerSocket serverSocket = new ServerSocket();
// 进行绑定
serverSocket.bind(new InetSocketAddress("localhost", 7007));

4受け入れる

acceptメソッドは主にServerSocketによってクライアントからのソケットを受け入れるために使用されます。この時点でクライアントからの要求がない場合、このメソッドは常にブロックします。setSoTimeoutメソッドによって設定されたタイムアウトがある場合、受け入れはタイムアウト内のみになります。ブロッキングすると、タイムアウト後に例外がスローされます。

bindメソッドとacceptメソッドの下部はどちらもネイティブメソッドによって実装されているため、ソースコードは調べません。

5インタビューの質問

5.1 SocketとServerSocketの理解について教えてください。
A:どちらもソケットと呼ぶことができます。最下層はTCP / UDPプロトコルに基づいています。ソケットは最下層プロトコルをカプセル化するため、使用しやすくなります。ソケットは、クライアント側からサーバー側によく使用されます。データの要求と応答の受け入れでは、サーバー側でServerSocketを使用して、クライアントからの要求を受け入れて処理することがよくあります。

5.2 SocketOptionsのSO_TIMEOUTについて教えてください
回答:SocketOptionsクラスには、SO_TIMEOUT、SO_LINGERなどの多くの属性設定があります。これらの質問についての理解を深めることができます。さまざまな属性の分析については、「ソケットのソースコードとインタビューの質問」を参照してください。

5.3ソケットを構築するとき、TCPまたはUDPを選択できますか?どのように選ぶべきですか?
回答:はい、ソケットには3つのパラメータコンストラクタがあります。3番目のパラメータは、TCPまたはUDPのどちらを使用するかを示します。

5.4 TCPには、サーバーが稼働しているかどうかを自動的に検出するメカニズムがありますか?もっと良い方法はありますか?
回答:はい、setKeepAliveメソッドを使用してこの関数をアクティブ化できます。2時間以内にクライアントとサーバーソケット間の通信がない場合、TCPは自動的にキープアライブプローブをサーバーに送信します。サーバーには3つの状況があると予測されます。 :

  1. サーバーは予想されるACK応答を使用して、すべてが正常であることを示します。
  2. サーバーはRSTで応答し、サーバーがクラッシュまたは再起動状態にあることを示し、接続を終了します。
  3. サーバーからの応答がありません(複数回試行されます)。これは、ソケットが閉じていることを示します。

ただし、この方法の使用はお勧めしません。スケジュールされたタスクを自分で開始し、サーバーの特別なインターフェイスに定期的にアクセスできます。サーバーから返されたデータが期待どおりであれば、サーバーは稼働しています。

まとめ

SocketとServerSocketは、ソースコードに関しては何も言う必要はありません。基本的には、これらは一部の設定です。基盤となる実装はネイティブメソッドですが、インタビュアーは、この列の範囲を超えているため、これからネットワークプロトコルの知識に拡張します。ちなみに、興味のある学生は自分で百度することができます。

公開された40元の記事 ウォンの賞賛1 ビュー5353

おすすめ

転載: blog.csdn.net/aha_jasper/article/details/105609548