这个问题很简单.为什么一个SOCKS感知套接字实现是实现抽象 java.net.socket类的默认选择?天真地我会期望java.net.PlainSocketImpl.

背景有点复杂.

我试图杀死GLASSFISH-12213(或者我真的想要解决它).错误本身的细节不是很重要 – 有一个本机库不是线程安全的,并且来自GlassFish创作的LDAP领域的一些并发用法使JVM崩溃.

为了解决这个问题,我开始反向工作:我可以避免首先调用本机库吗?这导致我有各种各样的理由来看sun.net.spi.DefaultProxySelector,负责finding an appropriate proxy (or not) for a given URI.有一个spot in there它进行本地方法调用,这是JVM崩溃发生的地方.如果我可以避免这个电话,我会在业务.

我可以避免这种呼叫的一种方式是,如果我可以确保sun.net.spi.NetProperties.getBoolean("java.net.useSystemProxies")的值为false.如果是这样,那么我之前提到的本机方法不会被调用. false是默认的,我根本没有修改任何这方面的东西.

(实际上是这样的情况;在我观察到错误的机器上运行的GlassFish实例中证明是可以证明的,我不知道这个代码如何可能仍然在加载本机库,这是另一天的主题.)

所以,在这个路径上,我进一步备份:在DefaultProxySelector.select(uri)调用中作为URI方案传递什么协议?也许我可能以某种方式影响愚蠢的事情,仍然以某种方式跳过本地电话.

事实证明,协议是套接字(我认为它可能是像ldap,但不是).这个事实和我的不情愿的假设告诉我,LDAP-realm-land中的某个地方手工打开了一个直接插座(即不使用像HttpUrlConnection或其他抽象类似的东西).果然,太阳编写的LDAP-JNDI网桥就是这样做的;传入的URI是socket:// somehost:389.

所以从所有这一切,尽管事实上我没有设置任何代理信息,配置任何东西或做任何事情,而不是使用直接的默认值,事实证明,JDK尝试使用SOCKS代理.请参阅the setImpl() method in java.net.Socket和line 364 or so of SocksSocketImpl.java,详细了解.

(这最后表明,我可以通过简单地在混合中添加一个socksNonProxyHosts = *系统属性来跳过这个整个的codepath.Jeez,这个行为不应该是默认的吗?)

因此,由于某些原因,DefaultProxySelector由于某些原因而拥有hasSystemProxies field set to true,尽管我或GlassFish的配置没有任何变化,但由于花园种类的Sun LDAP连接创建的花园种类套接字导致本机查找一个SOCKS代理服务器.也许这只是我,但那是我疯狂的.

所以读过这个的人也许 – 也许你在JDK团队,或知道一个人,或者知道这里的历史 – 知道为什么java.net.socket的默认实现总是寻找一个SOCKS代理?

更新:我可以看到答案是:所以如果你有一个系统代理设置在某个地方,并启​​用SOCKS,所有的东西都会流经它.但是如果java.net.useSystemProxies的默认值为false,那么对于SOCKS代理,狩猎(默认情况下)是什么意思?

解决方法

默认套接字实现是SocksSocketImpl,因为JRE可能已经通过系统属性-DsocksProxyHost和-DsocksProxyPort或ProxySelector.setDefault()或通过JRE安装的默认ProxySelect从外部配置为使用SOCKS.

PlainSocketImpl不会参考这些属性或类(因为它是一个普通的套接字,不应该知道任何代理),所以这些外部配置将被忽略,SocksSocketImpl总是被调用来检查它们.我同意,当没有人向JRE发表任何关于SOCKS的内容时,您会收到一个SocksSocketImpl似乎是奇怪的,但是我猜测到java.net.socket和ProxySelector的架构不允许在Socket实例化时预先选择正确的内容.

我认为你(或谁领导当前的Glassfish bug的调查行为)可能是错误的方式:而不是试图颠覆JRE选择套接字impls和代理的方式,为什么不修复默认的ProxySelector和/或OS本机调用,以便当Java对代理的信息进行标准查询时,事情不会中断.我认为修复是在代理查找过程和类的胆量,而不是更高.

也许另一种方式来问我问的是:如果DefaultProxySelector可以告诉我代理用于套接字连接,为什么Socket首先调用它来帮助它选择一个合理的实现?

我认为问题是java.net.socket支持多种编程模型.有一个明显的新Socket(主机,端口)构造函数,但是还有一个默认的构造函数Socket()可以先构造,然后在某些任意时间,将来可以调用它的连接(SocketAddress)方法.

由于ProxySelector可用于确定代理是否应被使用的部分标准是要连接的远程主机和远程端口的名称(即提供给connect的信息),即java.net. Socket构造函数太早,无法知道是否需要代理.

无论什么原因(我们可以假设历史?/向后兼容性原因?:),java.net.socket的构造函数是唯一的含义,也就是说,在某些情况下,这在某些情况下太早了将需要一个代理.

为什么java.net.SocksSocketImpl是Java中的默认java.net.Socket实现?的更多相关文章

  1. html5 http的轮询和Websocket原理

    这篇文章主要介绍了html5 http的轮询和Websocket原理的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Xcode C开发,需要澄清

    我非常喜欢Xcode提供对该语言可能的成员函数的深入了解的方式,并且更喜欢相对于文本伙伴使用它,如果不是因为我今天注意到的奇怪.当strings=“Teststring”时;唯一可用的substr签名如图所示但据我所知,签名应该是什么iseeonline确实s.substr(1,2);既被理解也适用于Xcode.当我尝试方法完成时为什么不显示?

  3. xamarin.ios – 没有找到ViewController ::.ctor(System.IntPtr)的构造函数

    我有一个问题,我的Monotouch应用程序有时在收到内存警告后才会崩溃.请参见下面的堆栈跟踪.堆栈跟踪是正确的,因为指定的类缺少构造函数获取IntPtr参数.但是这是有意的,因为我在应用程序中根本不使用InterfaceBuilder.那为什么会这样呢?

  4. ios – Swift:使用GCDAsyncUdpSocket接收UDP

    开始:接收:发送:编辑:添加了忘记的代码行.解决方法我终于得到它使用这个套接字设置:

  5. ios – Swift – NSURL错误

    尝试使用下面的NSURL类时出错,下面的代码实际上是试图将我从Facebook拉入的图像存储到imageView中.错误如下:不知道为什么会这样,帮忙!解决方法你正在调用的NSURL构造函数有这个签名:?表示构造函数可能不返回值,因此它被视为可选.NSData构造函数也是如此:快速解决方法是:最好的解决方案是检查(解包)这些选项,即使您确定它们包含值!

  6. 如何在Xcode中追踪“libc abi.dylib:纯虚函数!”

    我有一个多线程OSX应用程序,它使用C,Objective-C和Swift的混合.当我的应用程序关闭时,我在Xcode调试器窗口中看到了这一点:我知道这个错误通常是由对C类构造函数或析构函数中的虚函数的调用引起的.有没有一种简单的方法可以找到它的位置?

  7. Swift实现对象归档

    Swift实现对象归档时有几个注意点要继承NSCoding,实现两个方法extension是一个分类,分类不允许有存储能力,所以协议方法不能写在分类中协议中的init(coderdecoder:NSCoder)函数会覆盖原始的构造函数,所以类中至少还要有另一个init方法如果不指定键名,会使用属性名称作为key,基本数据类型,需要指定key

  8. 【Swift初见】Swift构造过程

    构造过程是通过构造器来实现的,其实每个构造器就可以看作是一个函数,只是这个函数是为了执行初始化的。每个类都必须拥有一个指定构造器。

  9. swift的struct结构体类型介绍使用

  10. swift struct

    //:Playground-noun:aplacewherepeoplecanplayimportCocoavarstr="Hello,playground"structpoint{varx=0;vary=init(x:Int,y:Int){self.x=x;y=y;println("init");}funcgetCenter()->Int{return(x+y)/2;}mutatingfunca

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部