应用程序
Socket客户端套接字.连接方法()
demo
java net包-socket
1.SocketImpl1
class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { 复制代码
2.SocketImpl2
/* * This class PlainSocketImpl simply delegates to the appropriate real * SocketImpl. We do this because PlainSocketImpl is already extended * by SocksSocketImpl. ** There are two possibilities for the real SocketImpl, * TwoStacksPlainSocketImpl or DualStackPlainSocketImpl. We use * DualStackPlainSocketImpl on systems that have a dual stack * TCP implementation. Otherwise we create an instance of * TwoStacksPlainSocketImpl and delegate to it. * * @author Chris Hegarty */class PlainSocketImpl extends AbstractPlainSocketImpl{ /** * Constructs an empty instance. */ PlainSocketImpl() { if (useDualStackImpl) { impl = new DualStackPlainSocketImpl(exclusiveBind); } else { impl = new TwoStacksPlainSocketImpl(exclusiveBind); } }复制代码
//https://github.com/frohoff/jdk8u-dev-jdk/blob/master/src/windows/classes/java/net/DualStackPlainSocketImpl.java
void socketConnect(InetAddress address, int port, int timeout) throws IOException { int nativefd = checkAndReturnNativeFD(); if (address == null) throw new NullPointerException("inet address argument is null."); int connectResult; if (timeout <= 0) { connectResult = connect0(nativefd, address, port); } else { configureBlocking(nativefd, false); try { connectResult = connect0(nativefd, address, port); if (connectResult == WOULDBLOCK) { waitForConnect(nativefd, timeout); } } finally { configureBlocking(nativefd, true); } } /* * We need to set the local port field. If bind was called * previous to the connect (by the client) then localport field * will already be set. */ if (localport == 0) localport = localPort0(nativefd); }复制代码
static native int connect0(int fd, InetAddress remote, int remotePort)throws IOException; //最终的话 都是调用 操作系统的套接字连接,具体流程是:jdk socket——》jvm native——》操作系统复制代码
总结
1.关于包
socket所有的类都在java.net包。nio类都在jdk nio包。
2.流程
最终的话 都是调用 操作系统的套接字连接,具体流程是:jdk socket——》jvm native——》操作系统