【问题标题】:How to implement a SocketImplFactory using systems default sockets如何使用系统默认套接字实现 SocketImplFactory
【发布时间】: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


    【解决方案1】:

    看来您正在尝试仅使用java.net 中的一个类,无需移动您的类 tot hat 包来创建它的实例。我建议改用反射。

    Constructor cons = Class.forName("java.net.SocksSocketImpl").getDeclaredConstructor();
    cons.setAccessible(true);
    SocketImpl si = (SocketImpl) cons.newInstance();
    

    但是,默认使用 SOCKS 可能不是一个好主意,因为它不仅会更改套接字的默认设置,还会更改所有套接字,甚至是供内部使用的套接字,例如 JMX 或 VisualVM。

    【讨论】:

      【解决方案2】:

      除了总是使用 SocksSocketImpl 之外,还有什么替代方法?

      我还发现了这个例子,它展示了这种方法的一些扩展可能性。 Finding out what network sockets are open in the current Java VM

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2022-12-17
        • 2019-12-11
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多