我经常遇到一个奇怪的问题(实际上经常).
我正在运行一个服务器应用程序,它为自己绑定一个套接字.
但有一段时间,套接字没有被释放.虽然Eclipse报告Terminate失败,但是它会从'ps'和JConsole/JVisualVM中正确消失,但是该过程终止了.'lsof'也不再为港口显示任何内容.但是,当我尝试再次启动服务器到同一端口时,我收到此错误:
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
Run Code Online (Sandbox Code Playgroud)
这个问题在我的单元测试中是最糟糕的,它永远不会完全运行,因为这肯定会在其中一个测试(所有重新创建服务器)之后发生.
我正在运行MacOSX 10.7.3
Java(TM)SE运行时环境(版本1.6.0_31-b04-415-11M3635)Java HotSpot(TM)64位服务器VM(版本20.6-b01-415,混合模式)
我也有Parallels,而且问题看起来似乎是由Parallels网络适配器造成的,但我不确定它是否与此问题有任何关系(我已经联系了他们的支持,目前为止没有任何帮助).
唯一有助于解决这种情况的是重启OSX.
有任何想法吗?
-
这是打开套接字的相关代码:
channel = (ServerSocketChannel) ServerSocketChannel.open().configureBlocking(false);
channel.socket().bind( addr, 0 );
Run Code Online (Sandbox Code Playgroud)
它被关闭了
channel.close();
Run Code Online (Sandbox Code Playgroud)
但我认为这个过程在这里被卡住了,然后Eclipse杀了它.
-
netstat -an(对于端口6007):
tcp4 73 0 127.0.0.1.6007 127.0.0.1.51549 ESTABLISHED
tcp4 0 0 127.0.0.1.51549 127.0.0.1.6007 ESTABLISHED
tcp4 73 0 127.0.0.1.6007 127.0.0.1.51544 CLOSE_WAIT
tcp4 0 0 127.0.0.1.6007 127.0.0.1.51543 CLOSE_WAIT
tcp4 0 0 10.37.129.2.6007 *.* LISTEN
tcp4 0 0 10.211.55.2.6007 *.* LISTEN
tcp4 0 0 …
Run Code Online (Sandbox Code Playgroud) 我有一个自定义COM服务器实现.服务器正在使用TComObjectFactory来创建用于客户端连接的COM对象.
我写得像这样:
function TPsOPCProviderClientFactory.CreateComObject(const Controller:
IUnknown): TComObject;
begin
FStartupCompleteEvent.WaitFor(INFINITE);
if Provider.State = OPC_STATUS_SUSPENDED then // Server already shutdown
raise EAbort.Create('Server shut down.');
Result := inherited CreateComObject(Controller);
(Result as TPsOPCProviderClient).Provider := Provider;
end;
Run Code Online (Sandbox Code Playgroud)
FStartupCompleteEvent用于确保应用程序在第一个连接通过之前就绪,并且Provider.State用于在服务器关闭时禁用客户端连接.
现在看来这不是取消对象创建的正确方法:如果引发异常,它将在屏幕上弹出一个带有"DAX Error"的消息对话框,客户端可能会崩溃.
使对象创建失败的正确方法是什么 - 或者是否必须始终成功?
该代码用于自Delphi 5以来可用于所有Delphi/C++ Builder版本的组件框架.
AtomicExchange 需要 Integer 或 NativeInt 变量,但我如何使用它(或类似的东西)以线程安全的方式设置布尔值 - 或者是否需要它?