バイオ:
ネイティブの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.ユーザ通信、スレッドは、受け入れにブロックされます。