BIOのプロセスと課題

バイオ:

ネイティブのJava IOモデル同期および閉塞従来のJavaプログラミングIO、その関連クラスは、java.ioであります

同期と閉塞;
サーバモデルは、接続したときに、接続がスレッドの不要なオーバーヘッドを引き起こすために何もしない場合、クライアントは接続要求を持っていることを、サーバは、処理のためのスレッドを開始する必要があるだろう、ネジ接続を達成するためにまたは時間の量の同時増加は、それがスレッドプールメカニズムを介して(実施複数のクライアントがサーバに接続する)ボトルネックを向上させることが可能です。

アクションシーン:

プログラムのシンプルで理解しやすい、以下の接続および固定インフラストラクチャ。

BIO単純なプロセスとどのように動作します:

ServerSocketの1.サーバーが開始
2.ソケットサーバの通信を開始kefuduanは、スレッドを作成するデフォルトの必要性により、サーバは、各顧客に伝達される
クライアントが要求を行う後、スレッドサーバの応答がある場合は最初のご相談、3。何を待つ、または拒否されますが存在しない場合は
、リクエストの終わりのための応答、クライアントスレッドの待機がある場合は、続行4.
:私たちは、コードの単純なアナログな外観BIOシナリオ使用ここで
サーバは:

package com.jym.bio;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @program: JymNetty
 * @description: bio应用实例
 * @author: jym
 * @create: 2020/01/31
 */
public class BioTest {
    public static void main(String[] args) throws IOException {
        // 创建线程池
        ExecutorService threadPool = Executors.newCachedThreadPool();
        // 创建serverSocket
        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务器启动了");
        while (true){
            // 监听 等待用户连接  如果没有用户连接,就会阻塞
            System.out.println("等待连接.....");
            final Socket accept = serverSocket.accept();
            System.out.println("连接到一个用户");
            // 新建一个线程 与之通讯
            threadPool.execute(new Runnable() {
                public void run() {
                    handler(accept);
                }
            });
        }


    }

    // 编写一个handler方法,和客户端通讯
    public static void handler(Socket socket){
        byte[] bytes = new byte[1024];
        // 通过socket获取输入流
        try {
            InputStream inputStream = socket.getInputStream();
            while (true){
                // 如果用户什么都没发送,也会阻塞
                System.out.println("等待用户发送数据....");
                int read = inputStream.read(bytes);
                if(read!=-1){
                    // 输出客户端发送的数据
                    System.out.println(Thread.currentThread().getName()+"发送的消息为:"+new String(bytes,0,read));
                } else {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            System.out.println("关闭和client的连接");
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

当社のクライアントは、書き込みをコードしない、とのtelnetコマンドを使用して直接データを送信します
telnetコマンドを使用する前に、当社のサーバーを起動する必要があります
プロンプトのコマンドを開きます
+ R&LT入力cmdを勝ちます
その後のtelnet 127.0.0.1 6666を入力し、Enter
あなたがいないtelnetコマンドプロンプト言うならば、あなたは、特定の手順をオンにする必要があります。
ここに画像を挿入説明

ここに画像を挿入説明
新しいウィンドウを起動するにはtelnetコマンドを使用した後、+] Ctrlキーを入力して、あなたがメッセージを送ることができる
情報をプリントアウトし、その後、サーバー・コンソールに送信された情報に接続され、コマンドライン入力を送る
ここに画像を挿入説明
次は、メッセージを送信するためにTelnetウィンドウを起動します、見つかったコンソールを監視
ここに画像を挿入説明
2つのウィンドウが関係なく、ワーカースレッドの、各通信BIOは、新しいスレッドを作成することを示す、スレッド名が同じではありません、メッセージを送信する作業をしません
BIOは行わフローチャート:
ここに画像を挿入説明
シミュレーションシナリオを実行した後も、BIOのフローチャートは、大きな問題があるが見つかりました:
1。すべての要求は、スレッドの作成を必要とし、クライアント、サービス処理、書き込みに対応した読み出しデータ
2同時性が大きい、我々は、ハンドル接続に多数のスレッドを作成するために、システムリソースの消費必要
な接続が確立された後、スレッドは一時的に読むためにはデータがない場合何がある場合、スレッドは、リソーススレッドの無駄が生じ、読み取りでブロックされていない3.ユーザ通信、スレッドは、受け入れにブロックされます。

悪いの学習時間の不足、あまりにも浅い知識は、ご容赦ください。

人々の10種類が世界であり、1は、1つのバイナリを理解していないで、バイナリを理解することです。

公開された71元の記事 ウォン称賛54 ビュー420 000 +

おすすめ

転載: blog.csdn.net/weixin_43326401/article/details/104125727