HTTPサーバーの原理:
1 创建一个ServerSocket,监听并绑定一个端口
2 一系列客户端来请求这个端口
3 服务器使用Accept,获得一个来自客户端的Socket连接对象
4 启动一个新线程处理连接
1) 读Socket,得到字节流
2) 解码协议,得到Http请求对象
3) 处理Http请求,得到一个结果,封装成一个HttpResponse对象
4) 编码协议,将结果序列化字节流
5) 写Socket,将字节流发给客户端
5 继续循环步骤3
HTTPサーバーは、エンコードとデコードのプロトコルがHTTPプロトコルであるため、HTTPサーバーと呼ばれます。プロトコルがRedisプロトコルの場合は、Redisサーバーになり、プロトコルがWebSocketの場合は、WebSocketサーバーになります。 。
Nettyを使用すると、コーデックプロトコルをカスタマイズし、独自の特定のプロトコルサーバーを実装できます。
NIOがBIOよりも速い理由:
1. BIOでは、クライアントがデータを送信するのを待つプロセスがブロックされるため、1つのスレッドが1つの要求しか処理できず
、マシンがサポートできるスレッドの最大数が制限されるため、BIOは高をサポートできません同時実行の理由。
2. NIOでは、ソケットが確立されると、スレッドはソケットを受け入れるためにブロックしませんが、要求をセレクターに渡します。
セレクターは引き続きすべてのソケットをトラバースします。ソケットが確立されると、スレッドに通知されます。 、次にスレッドは
データを処理してからクライアントに返します-このプロセスはブロックされているため、スレッドはより多くのリクエストを処理できます。
Nettyが高速で送信するのはなぜですか
Nettyの高速伝送は、実際にはNIOゼロコピーの機能に依存しています。Javaのメモリには、ヒープメモリ、スタックメモリ、文字列定数プールなどが
含まれます。その中で、ヒープメモリは最大のメモリ空間であり、Javaオブジェクトが格納される場所でもあります。通常、データを読み取る必要がある場合IOからヒープへメモリは
途中でソケットバッファを通過する必要があります。つまり、データの一部が最後に到達するために2回コピーされます。データの量が多いと、不要なリソースの浪費が発生します。
この状況に対応して、NettyはNIOのもう1つの主要機能であるゼロコピーを使用します。データを受信する必要がある場合、ヒープメモリの外部のメモリを開き、
データはIOからそのメモリに直接読み取られます。これらのデータは、nettyのByteBufを介して直接操作できるため、送信が高速化されます。