09. Java NIO SocketChannel 套接字通道

在Java NIO体系中,SocketChannel是用于TCP网络链接的套接字接口,至关于Java网络编程中的Socket套接字接口。建立SocketChannel主要有两种方式,以下:编程

  1. 打开一个SocketChannel并链接网络上的一台服务器。
  2. 当ServerSocketChannel接收到一个链接请求时,会建立一个SocketChannel。

创建一个SocketChannel链接

打开一个SocketChannel能够这样操做:服务器

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

关闭一个SocketChannel链接

关闭一个SocketChannel只须要调用他的close方法,以下:网络

socketChannel.close();

从SocketChannel中读数据

从一个SocketChannel链接中读取数据,能够经过read()方法,以下:异步

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = socketChannel.read(buf);

首先须要开辟一个Buffer。从SocketChannel中读取的数据将放到Buffer中。socket

接下来就是调用SocketChannel的read()方法.这个read()会把通道中的数据读到Buffer中。read()方法的返回值是一个int数据,表明这次有多少字节的数据被写入了Buffer中。若是返回的是-1,那么意味着通道内的数据已经读取完毕,到底了(连接关闭)。spa

向SocketChannel写数据

向SocketChannel中写入数据是经过write()方法,write也须要一个Buffer做为参数。下面看一下具体的示例:code

String newData = "New String to write to file..." + System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());

buf.flip();

while(buf.hasRemaining()) {
    channel.write(buf);
}

仔细观察代码,这里咱们把write()的调用放在了while循环中。这是由于咱们没法保证在write的时候实际写入了多少字节的数据,所以咱们经过一个循环操做,不断把Buffer中数据写入到SocketChannel中知道Buffer中的数据所有写入为止。接口

非阻塞模式

咱们能够吧SocketChannel设置为non-blocking(非阻塞)模式。这样的话在调用connect(), read(), write()时都是异步的。ip

connect()

若是咱们设置了一个SocketChannel是非阻塞的,那么调用connect()后,方法会在连接创建前就直接返回。为了检查当前连接是否创建成功,咱们能够调用finishConnect(),以下:get

socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

while(! socketChannel.finishConnect() ){
    //wait, or do something else...    
}

write()

在非阻塞模式下,调用write()方法不能确保方法返回后写入操做必定获得了执行。所以咱们须要把write()调用放到循环内。这和前面在讲write()时是同样的,此处就不在代码演示。

read()

在非阻塞模式下,调用read()方法也不能确保方法返回后,确实读到了数据。所以咱们须要本身检查的整型返回值,这个返回值会告诉咱们实际读取了多少字节的数据。

Selector结合非阻塞模式

SocketChannel的非阻塞模式能够和Selector很好的协同工做。把一个活多个SocketChannel注册到一个Selector后,咱们能够经过Selector指导哪些channels通道是处于可读,可写等等状态的。后续咱们会再详细阐述若是联合使用Selector与SocketChannel。

相关文章
相关标签/搜索