TL; DR
, true isOutputShutdown shutdownOutput . Socket. , true, .
- ;)
isOutputShutdown java.net.Socket:
public boolean isOutputShutdown() {
return shutOut;
}
, , shutOut. , true shutdownOutput ( )
public void shutdownOutput() throws IOException
{
if (isClosed())
throw new SocketException("Socket is closed");
if (!isConnected())
throw new SocketException("Socket is not connected");
if (isOutputShutdown())
throw new SocketException("Socket output is already shutdown");
getImpl().shutdownOutput();
shutOut = true;
}
, SocketException, , , Socket . getImpl, , , shutdownOutput .
SocketImpl getImpl() throws SocketException {
if (!created)
createImpl(true);
return impl;
}
javadoc , SocketImpl, . , , . SocketImpl - , , shutdownOutput.
, factory instance
factory.createSocketImpl()
, SocketImplFactory. - SocketImpl createSocketImpl();. SicketImpl, shutdownOutput?
AbstractPlainSocketImpl ( ), SocketImpl. javadoc - . , . , , , shutdownOutput.
protected void shutdownInput() throws IOException {
if (fd != null) {
socketShutdown(SHUT_RD);
if (socketInputStream != null) {
socketInputStream.setEOF(true);
}
shut_rd = true;
}
}
protected void shutdownOutput() throws IOException {
if (fd != null) {
socketShutdown(SHUT_WR);
shut_wr = true;
}
}
, ? fd socketShutdown.
! SHUT_WR?
, @EJP, API Berkeley Sockets. , (0 , 1 )
public final static int SHUT_RD = 0;
public final static int SHUT_WR = 1;
socketShutdown,
abstract void socketShutdown(int howto)
throws IOException;
, , ...
, PlainSocketImpl, AbstractPlainSocketImpl.
native void socketShutdown(int howto) throws IOException;
java.net.PlainSocketImpl.c .
Java_java_net_PlainSocketImpl_socketShutdown(JNIEnv *env, jobject this,
jint howto)
{
jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
jint fd;
if (IS_NULL(fdObj)) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"socket already closed");
return;
} else {
fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
}
JVM_SocketShutdown(fd, howto);
}
, , .
"" OutputStream InputStream
isOutputShutdown false, isClosed true?
, , shutOut boolean true shutdownOutput
public void shutdownOutput() throws IOException
{
if (isClosed())
throw new SocketException("Socket is closed");
if (!isConnected())
throw new SocketException("Socket is not connected");
if (isOutputShutdown())
throw new SocketException("Socket output is already shutdown");
getImpl().shutdownOutput();
shutOut = true;
}
, Socket boolean true. false, , , Socket the Stream .