如何使用系统默认套接字实现 SocketImplFactory
How to implement a SocketImplFactory using systems default sockets
我在 Java 中实现自己的 SocketImplFactory 时遇到了一个小问题。
我的目标是编写一个工厂,它为我提供了一种通过一个简单的方法调用来关闭所有打开的套接字的方法。所以我只想有一种 "proxy factory" 将所有创建的套接字存储在列表中。在这个列表上,我可以执行我需要的所有操作。
我试过这样实现的:
package java.net;
import java.io.IOException;
import java.net.SocketImpl;
import java.net.SocketImplFactory;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.io.IOUtils;
import com.crosscloud.applicationlayer.logger.CCLogger;
public class CCSocketImplFactory implements SocketImplFactory
{
private List<SocketImpl> _openSockets;
public CCSocketImplFactory()
{
_openSockets = new LinkedList<>();
}
@Override
public SocketImpl createSocketImpl()
{
SocketImpl impl = new SocksSocketImpl();
_openSockets.add(impl);
return impl;
}
public void closeAll()
{
_openSockets.forEach((socket)->
{
try
{
socket.close();
}
catch (Exception e)
{
logException(this, e);
}
});
}
public static CCSocketImplFactory register()
{
CCSocketImplFactory fact = new CCSocketImplFactory();
try
{
Socket.setSocketImplFactory(fact);
}
catch (IOException e)
{
logException(CCSocketImplFactory.class, e);
}
return fact;
}
我现在遇到的问题是我必须在包 java.net 中创建 class 因为 class SocksSocketImpl(在我看来这应该是标准类型)是仅在此包中可见。
当我现在想要 运行 代码时,我得到了一个 SecurityException,因为包名称被禁止。
我的问题有解决方法吗?
谢谢!
您似乎只想使用 java.net
中的一个 class 没有必要移动您的 class tot hat 包只是为了创建它的一个实例。我建议改用反射。
Constructor cons = Class.forName("java.net.SocksSocketImpl").getDeclaredConstructor();
cons.setAccessible(true);
SocketImpl si = (SocketImpl) cons.newInstance();
然而,默认使用 SOCKS 可能不是一个好主意,因为它不仅会更改套接字的默认值,还会更改所有套接字,甚至是内部使用的套接字,例如 JMX 或 VisualVM。
除了总是使用 SocksSocketImpl 之外,还有什么替代方法?
我还找到了这个示例,它显示了此方法的一些扩展可能性。
Finding out what network sockets are open in the current Java VM
我在 Java 中实现自己的 SocketImplFactory 时遇到了一个小问题。 我的目标是编写一个工厂,它为我提供了一种通过一个简单的方法调用来关闭所有打开的套接字的方法。所以我只想有一种 "proxy factory" 将所有创建的套接字存储在列表中。在这个列表上,我可以执行我需要的所有操作。
我试过这样实现的:
package java.net;
import java.io.IOException;
import java.net.SocketImpl;
import java.net.SocketImplFactory;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.io.IOUtils;
import com.crosscloud.applicationlayer.logger.CCLogger;
public class CCSocketImplFactory implements SocketImplFactory
{
private List<SocketImpl> _openSockets;
public CCSocketImplFactory()
{
_openSockets = new LinkedList<>();
}
@Override
public SocketImpl createSocketImpl()
{
SocketImpl impl = new SocksSocketImpl();
_openSockets.add(impl);
return impl;
}
public void closeAll()
{
_openSockets.forEach((socket)->
{
try
{
socket.close();
}
catch (Exception e)
{
logException(this, e);
}
});
}
public static CCSocketImplFactory register()
{
CCSocketImplFactory fact = new CCSocketImplFactory();
try
{
Socket.setSocketImplFactory(fact);
}
catch (IOException e)
{
logException(CCSocketImplFactory.class, e);
}
return fact;
}
我现在遇到的问题是我必须在包 java.net 中创建 class 因为 class SocksSocketImpl(在我看来这应该是标准类型)是仅在此包中可见。
当我现在想要 运行 代码时,我得到了一个 SecurityException,因为包名称被禁止。
我的问题有解决方法吗? 谢谢!
您似乎只想使用 java.net
中的一个 class 没有必要移动您的 class tot hat 包只是为了创建它的一个实例。我建议改用反射。
Constructor cons = Class.forName("java.net.SocksSocketImpl").getDeclaredConstructor();
cons.setAccessible(true);
SocketImpl si = (SocketImpl) cons.newInstance();
然而,默认使用 SOCKS 可能不是一个好主意,因为它不仅会更改套接字的默认值,还会更改所有套接字,甚至是内部使用的套接字,例如 JMX 或 VisualVM。
除了总是使用 SocksSocketImpl 之外,还有什么替代方法?
我还找到了这个示例,它显示了此方法的一些扩展可能性。 Finding out what network sockets are open in the current Java VM