2012-09-26 118 views
1

我已经构建了一个Java Socket服务器,用于监听我的freebsd服务器上的帖子。Java套接字服务器死亡

Server类监听端口,并接受连接。 每个新连接都会发送到ServerManager,并将其保存在列表中,并遍历它以检查新数据。迭代通过无限while loop完成。

我注意到,运行服务器几天后已经死亡。我不知道是什么杀死了它。 系统是否有可能杀死它,就像Android在内存和资源不足时进行处理一样? 有没有办法避免这种情况?也许创造某种“看门狗”重新启动它的情况下被杀死?

+0

你关闭了套接字吗? – SJuan76

+1

也许你的进程内存不足(我认为它没有耗尽文件描述符)。不过这听起来很奇怪。对'read()'的调用是阻塞的,所以要么使用线程,要么使用NIO等。你能分享更多细节吗? – Raffaele

+0

@Raffaele当ServerManager发现有新的数据可用时,它启动一个新的线程来处理数据,当完成线程关闭时 –

回答

0

如果的getInputStream()。可用()> 0运行处理它

这是不正确的一个新的线程。 (a)没有必要,(b)如果它为零会发生什么?只需为接受的套接字生成线程,使用阻塞读取处理输入流,并在完成时关闭所有内容(即当read()返回-1或抛出异常时)。

除了将它传递给新线程外,accept循环对接受的套接字不应该做任何事情。

+0

如果其为零,它将继续运行以检查下一个套接字连接。 accept不会循环抛出任何东西......它只是将打开的连接发送给管理器,然后管理连接。但即使按照你的说法写错了,为什么会被杀呢? –

+0

@AsafNevo如果它为零,您仍然应该创建线程并让线程处理I/O。否则没有人会照顾它:你有一个套接字泄漏;你有一个你观察到的行为的解释。只要删除该代码即可。 – EJP

+0

如果它的零不表示有0个字节要读取?我应该如何在线程中处理它? –