小编Jou*_*Aro的帖子

Mac OSX上的Java进程不会释放套接字

我经常遇到一个奇怪的问题(实际上经常).

我正在运行一个服务器应用程序,它为自己绑定一个套接字.

但有一段时间,套接字没有被释放.虽然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)

java eclipse macos parallels

12
推荐指数
1
解决办法
3619
查看次数

如何从TComObjectFactory.CreateComObject返回错误(const Controller:IUnknown):TComObject

我有一个自定义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版本的组件框架.

delphi com

3
推荐指数
1
解决办法
757
查看次数

如何在 Delphi 中自动设置布尔值?

AtomicExchange 需要 Integer 或 NativeInt 变量,但我如何使用它(或类似的东西)以线程安全的方式设置布尔值 - 或者是否需要它?

delphi

3
推荐指数
1
解决办法
1504
查看次数

标签 统计

delphi ×2

com ×1

eclipse ×1

java ×1

macos ×1

parallels ×1