概述如何等待一个TCP端口真的(本地)在Java中closures?
我为什么问这个问题?
如果你愿意,你可以跳过这个故事。 还有些人可能会感兴趣。
我有一个embedded式的JavaKeeper服务器。 在unit testing中,我将端口分配给testing服务器。 在分配端口之前,我打开ServerSocket检查是否未使用,然后closures它。
BindException ,在unit testing中,当我启动服务器的时候,我得到了BindException (不能把我的端口分配给两台服务器,因为我使用了文件锁来互斥) 。 原来是这样的,对于端口检查我打开端口,然后closures它,在 *** 作系统级别等待一会儿,直到端口可以重新打开。
然而,有一个选项( StandardSocketoptions.so_REUSEADDR )可以告诉Java套接字,TIMED_WAIT状态的旧套接字可以被重用。 检查ZooKeeper代码后,它实际上设置为true(请参阅org.apache.zookeeper.server.NIOServerCnxnFactory.configure(InetSocketAddress,int) ):
使用WinSock侦听任意ICMP超时(TTL = 0)数据包
读取套接字行为
检测UDP组播接收失败
套接字文件系统与普通的磁盘文件系统
在linux中简单的套接字转发
@OverrIDe public voID configure(InetSocketAddress addr,int maxcc) throws IOException { configureSasllogin(); thread = new Thread(this,\”NIOServerCxn.Factory:\” + addr); thread.setDaemon(true); maxClIEntCnxns = maxcc; this.ss = ServerSocketChannel.open(); ss.socket().setReuseAddress(true); LOG.info(\”binding to port \” + addr); ss.socket().bind(addr); ss.configureBlocking(false); ss.register(selector,SelectionKey.OP_ACCEPT); }
但是我的testingcertificate它不起作用。 我得到BindException(在linux JDK 1.7.0_60下)。
在检查ServerSocketChannel实现(JDK 1.7.0_60)后,我意识到,这从来没有在linux下工作。 请参阅sun.nio.ch.ServerSocketChannelimpl.setoption(Socketoption<T>,T) :
public <T> ServerSocketChannel setoption(Socketoption<T> paramSocketoption,T paramT) throws IOException { if (paramSocketoption == null) throw new NullPointerException(); if (!(supportedOptions().contains(paramSocketoption))) throw new UnsupportedOperationException(\”\’\” + paramSocketoption + \”\’ not supported\”); synchronized (this.stateLock) { if (!(isopen())) throw new ClosedChannelException(); if ((paramSocketoption == StandardSocketoptions.so_REUSEADDR) && (Net.useExclusiveBind())) { this.isReuseAddress = ((Boolean)paramT).booleanValue(); } else { Net.setSocketoption(this.fd,Net.Unspec,paramSocketoption,paramT); } return this; } }
不幸的是Net.useExclusiveBind()永远不会在linux下返回true,如果你在类似的OpenJDK中检查它的源代码,它依赖于Net.isExclusiveBindAvailable() ,在linux下它是-1。
你有解决方法吗?
有没有办法在Java中等待,直到一个端口是真正的本地closures开放一个ServerSocket没有SO_REUSEADDR,并检查如果我得到BindException ? 当然,这不是一个解决scheme,因为那么我必须再次closuresServerSocket。 为什么在Java中没有像封闭模式closures套接字那样,只有当套接字真的在 *** 作系统级closures时才会返回?
什么是套接字组? (视窗)
禁用UDP广播的自我接收
在linux上使用TCP进行文件传输
许多文件之间的许多数据最快的套接字方法
是否有一个非阻塞方法比select()和poll()更快地检查数据?
你做了一个逻辑错误,如果关闭在java中的套接字 *** 作系统层上的文件描述符是关闭的。 但是你的问题是因为你接受了套接字的端口可以通过等待连接被阻塞。 所以你一定要先关闭它们。 最好创建一个客户端套接字,并检查是否可以将其绑定到选定的端口。
总结
以上是内存溢出为你收集整理的如何等待一个TCP端口真的(本地)在Java中closures?全部内容,希望文章能够帮你解决如何等待一个TCP端口真的(本地)在Java中closures?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容