如何使用系统默认套接字实现SocketImplFactory

雅各布·奥尔(Jakob Auer)

我在用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用系统默认套接字实现SocketImplFactory

来自分类Dev

如何使用套接字安全地实现通知系统?

来自分类Dev

如何使用ZeroMQ实现多个套接字?

来自分类Dev

如何使用快速游乐场实现套接字连接?

来自分类Dev

套接字默认超时

来自分类Dev

Python套接字实现

来自分类Dev

套接字主机名查找超时:如何实现?

来自分类Dev

套接字主机名查找超时:如何实现?

来自分类Dev

仅使用套接字实现单进程管道

来自分类Dev

使用套接字的C ++ FTP PORT命令实现

来自分类Dev

如何使用Qt阻止tcp套接字?

来自分类Dev

单声道如何使用BSD套接字?

来自分类Dev

如何开始使用Web套接字?

来自分类Dev

如何使用SocketIO订阅套接字通道?

来自分类Dev

如何开始使用Web套接字?

来自分类Dev

scapy 中的套接字实现

来自分类Dev

使用套接字的IllegalBlockingModeException

来自分类Dev

如何在不创建套接字文件的情况下使用Unix域套接字

来自分类Dev

python套接字如何使用相同的套接字连接正确重定向http / s请求?

来自分类Dev

如何使用cppzmq从ROUTER套接字向特定的DEALER套接字发送ZeroMQ消息?

来自分类Dev

如何使用客户端套接字作为服务器套接字python

来自分类Dev

系统套接字激活标准输入

来自分类Dev

无法在系统服务中打开套接字

来自分类Dev

如何使用系统属性实现参数?

来自分类Dev

默认套接字超时[XAMPP HTTPS]

来自分类Dev

默认套接字超时[XAMPP HTTPS]

来自分类Dev

为什么套接字实现比请求慢?

来自分类Dev

C#套接字实现的比较

来自分类Dev

glibc的套接字实现在哪里?