@@ -755,7 +755,7 @@ public class ChatServer {
755755客户端
756756
757757``` java
758- package chat ;
758+ package manybuffers ;
759759
760760import java.io.BufferedReader ;
761761import java.io.InputStreamReader ;
@@ -774,72 +774,72 @@ public class ChatClient {
774774 public static void main (String [] args ) {
775775 try {
776776 SocketChannel socketChannel = SocketChannel . open();
777- socketChannel. configureBlocking(false ) ;
777+ socketChannel. configureBlocking(false );
778778 Selector selector = Selector . open();
779779 // 注册“连接事件”
780- socketChannel. register( selector , SelectionKey . OP_CONNECT ) ;
780+ socketChannel. register(selector, SelectionKey . OP_CONNECT );
781781
782- int [] ports = {7777 ,8888 ,9999 } ;
783- int port = ports[ (int )(Math . random()* 3 ) ] ;
784- socketChannel. connect(new InetSocketAddress (" 127.0.0.1" ,port)) ;
782+ int [] ports = {7777 , 8888 , 9999 };
783+ int port = ports[(int ) (Math . random() * 3 )] ;
784+ socketChannel. connect(new InetSocketAddress (" 127.0.0.1" , port));
785785
786- while (true ){
787- selector. select() ;
786+ while (true ) {
787+ selector. select();
788788 // selectionKeys:包含了所有的事件
789789 Set<SelectionKey > selectionKeys = selector. selectedKeys();
790790
791791 Iterator<SelectionKey > keyIterator = selectionKeys. iterator();
792- while (keyIterator. hasNext() ) {
792+ while (keyIterator. hasNext()) {
793793
794794 SelectionKey selectionKey = keyIterator. next();// 每个事件
795795 // 真实的发生“连接事件”
796- if (selectionKey. isConnectable()){ // 连接完毕?接收(读)、发送(写)
796+ if (selectionKey. isConnectable()) { // 连接完毕?接收(读)、发送(写)
797797 // buffer + channel
798798 ByteBuffer sendBuffer = ByteBuffer . allocate(1024 );
799- SocketChannel clientChannel = (SocketChannel )selectionKey. channel();
799+ SocketChannel clientChannel = (SocketChannel ) selectionKey. channel();
800800
801801
802- if (clientChannel. isConnectionPending()){// 正在连接
802+ if (clientChannel. isConnectionPending()) {// 正在连接
803803
804- if (clientChannel. finishConnect()){
805- System . out. println(" 连接服务端成功,连接的端口是:" + port);
804+ if (clientChannel. finishConnect()) {
805+ System . out. println(" 连接服务端成功,连接的端口是:" + port);
806806 // 向服务端 发送一条测试数据
807- sendBuffer. put(" connecting" . getBytes()) ;
808- sendBuffer. flip() ;
809- clientChannel. write(sendBuffer) ;
810-
807+ sendBuffer. put(" connecting" . getBytes());
808+ sendBuffer. flip();
809+ clientChannel. write(sendBuffer);
811810 }
812811 }
813812 // 在客户端看来,“写操作”不需要注册到通道中,再去使用?
814813
815814 // 客户端,每次写操作,创建一个线程
816- new Thread ( ()- > {
817- try {
818- sendBuffer. clear();
819- // 写数据: 接收用户从控制台输入的内容
820- InputStreamReader reader = new InputStreamReader (System . in);
821- BufferedReader bReader = new BufferedReader (reader);
822- String message = bReader. readLine();
823-
824- sendBuffer. put(message. getBytes()) ;
825- sendBuffer. flip() ;
826- clientChannel. write( sendBuffer) ;
827-
828- // 发送数据
829- }catch (Exception e){
830- e. printStackTrace();
815+ new Thread (() - > {
816+ while (true ) {
817+ try {
818+ sendBuffer. clear();
819+ // 写数据: 接收用户从控制台输入的内容
820+ InputStreamReader reader = new InputStreamReader (System . in);
821+ BufferedReader bReader = new BufferedReader (reader);
822+ String message = bReader. readLine();
823+
824+ sendBuffer. put(message. getBytes());
825+ sendBuffer. flip();
826+ clientChannel. write(sendBuffer);
827+
828+ // 发送数据
829+ } catch (Exception e) {
830+ e. printStackTrace();
831+ }
831832 }
832-
833- } ) .start();
833+ }). start();
834834
835835
836836 // 发送数据(写)
837- clientChannel. register( selector,SelectionKey . OP_READ ) ;
838- }else if (selectionKey. isReadable() ) {// 读
837+ clientChannel. register(selector, SelectionKey . OP_READ );
838+ } else if (selectionKey. isReadable()) {// 读
839839 ByteBuffer readBuffer = ByteBuffer . allocate(1024 );
840- SocketChannel clientChannel = (SocketChannel )selectionKey. channel();
840+ SocketChannel clientChannel = (SocketChannel ) selectionKey. channel();
841841 int len = clientChannel. read(readBuffer);// 读
842- if (len> 0 ) {
842+ if (len > 0 ) {
843843 String receive = new String (readBuffer. array(), 0 , len);
844844 System . out. println(receive);
845845 }
@@ -848,7 +848,7 @@ public class ChatClient {
848848
849849 selectionKeys. clear();
850850 }
851- }catch (Exception e){
851+ } catch (Exception e) {
852852 e. printStackTrace();
853853 }
854854 }
@@ -866,7 +866,66 @@ public class ChatClient {
866866
867867
868868
869+ ### 用同一个channel读取多个缓冲区
870+
871+ 注意:如果有2个缓冲区a\b; 先把a读满,再去读取b
872+
873+ ![ 1582010264341] ( NIO.assets/1582010264341.png )
874+
875+ ``` java
876+ package manybuffers ;
877+
878+ import java.net.InetSocketAddress ;
879+ import java.net.ServerSocket ;
880+ import java.nio.ByteBuffer ;
881+ import java.nio.channels.ServerSocketChannel ;
882+ import java.nio.channels.SocketChannel ;
883+
884+ /*
885+ * Created by 颜群
886+ */
887+ public class NIOServer {
888+ public static void main (String [] args ) throws Exception {
889+ ServerSocketChannel serverSocketChannel = ServerSocketChannel . open();
890+ ServerSocket serverSocket = serverSocketChannel. socket();
891+ serverSocket. bind( new InetSocketAddress (8888 )) ;
892+ // 定义两个缓冲区,接受客户端的数据
893+ ByteBuffer [] buffers = new ByteBuffer [2 ] ;
894+ buffers[0 ] = ByteBuffer . allocate(4 ) ;
895+ buffers[1 ] = ByteBuffer . allocate(8 ) ;
896+ int bufferSize = 4 + 8 ;// 总容量
897+
898+ SocketChannel socketChannel = serverSocketChannel. accept();
899+ System . out. println(" 服务端:接收到客户端连接。。。" );
900+ while (true ){// 接收数据
901+ int totalRead = 0 ;// 每一次实际使用
902+ // 如果buffer没满,继续读
903+ while (totalRead < bufferSize){
904+ long read = socketChannel. read(buffers);
905+ totalRead += read ;
906+ System . out. println(" 【每一次】,实际读取到的数据大小:" + read);
907+ // System.out.println("实际读取到的【总数据】大小:"+totalRead);
908+ }
909+ // 如果buffer已满, flip() ;
910+ for (ByteBuffer buffer: buffers){
911+ buffer. flip() ;
912+ }
913+ }
914+
915+ }
916+ }
917+
918+ ```
919+
920+ 客户端沿用之前的client
921+
922+ buffer1: 4
923+ buffer2: 8
924+ 服务端buffers:共12
869925
870926
927+ 客户端发送: 10 ,11(2+9) + 4(3xxxx+1)
871928
929+ ![ 1582011476690] ( NIO.assets/1582011476690.png )
872930
931+ ![ 1582011490116] ( NIO.assets/1582011490116.png )
0 commit comments