Nio的基础其实在linux 下的scoket编程简单直接,就是建立socket的时候加一个参数:
#include
#include
.
.
.
sockfd = socket(PF_INET, SOCK_STREAM, 0);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
.
.
.
但是在java 里面就过程比较复杂了:
1.它使用了configureBlocking 函数来设置非blocking模式。
SocketChannel.configureBlocking(false);
2.接下来会调用sun.nio.ch.IOUtil 里面的native JNI code
public static native voidconfigureBlocking(FileDescriptor var0, booleanvar1) throwsIOException;
3.接下来就是真的用了C里面的函数来设置非阻塞模式了:
static int
configureBlocking(int fd, jboolean blocking)
{
int flags = fcntl(fd, F_GETFL);
int newflags = blocking ? (flags & ~O_NONBLOCK) : (flags | O_NONBLOCK);
return (flags == newflags) ? 0 : fcntl(fd, F_SETFL, newflags);
}
JNIEXPORT void JNICALL
Java_sun_nio_ch_IOUtil_configureBlocking(JNIEnv *env, jclass clazz,
jobject fdo, jboolean blocking)
{
if (configureBlocking(fdval(env, fdo), blocking) < 0)
JNU_ThrowIOExceptionWithLastError(env, "Configure blocking failed");
}
其它的java 部分可以参考: