我在用Java实现自己的SocketImplFactory时遇到了一个小问题。我的目标是写一个工厂,为我提供一种通过一个简单的方法调用关闭所有打开的套接字的方法。因此,我只想拥有一种“代理工厂”,它将所有创建的套接字存储在列表中。在此列表中,我可以执行我需要的所有操作。
我试图这样实现:
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中创建该类,因为类SocksSocketImpl(我认为这应该是标准类型)仅在此包中可见。
现在,当我想运行代码时,我得到了SecurityException,因为程序包名称被禁止。
我的问题有解决方法吗?谢谢!
看来您正在尝试仅使用中的一个类。java.net
不必仅将类创建为它的一个实例,就将其移到该包中。我建议改用反射。
Constructor cons = Class.forName("java.net.SocksSocketImpl").getDeclaredConstructor();
cons.setAccessible(true);
SocketImpl si = (SocketImpl) cons.newInstance();
但是,默认情况下使用SOCKS可能不是一个好主意,因为它不仅会更改套接字的默认值,还会更改所有套接字,甚至供内部使用的套接字(例如JMX或VisualVM)更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句