【发布时间】:2015-01-10 09:19:43
【问题描述】:
我在用 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 sockets package securityexception