5

我有一个作为接受连接的服务器运行的 java 程序,我将 Android 客户端连接到它。客户端长时间连接到他们的套接字。

1) 在一台具有 3 Gb RAM 的普通机器上,我可以同时拥有多少个客户端(实际上——我现在不是在谈论端口数)?

2)如果手机使用3G连接,会不会是socket坏了?如果是,我该如何恢复它或者应该从客户端完成?还是自动完成?它经常发生吗?

4

3 回答 3

3

1)取决于服务器为客户端所做的事情。如果服务器只是接受连接并且什么都不做,它可能可以为数以万计的客户端提供服务。如果服务器执行需要 CPU、内存或 I/O 的操作,它可以为更少的客户端提供服务。

2) 是的,即使在有线网络上,TCP 连接也会中断。如果链接返回,则套接字连接没有断开;TCP 处理丢失数据的重传。问题是,如果链接不回来怎么办?如果您使用SO_KEEPALIVE连接最终将被关闭,但由于默认超时是 2 小时,因此对这个问题敏感的应用程序会实现自己的超时机制。

于 2013-06-27T17:25:20.867 回答
1

1) 在一台具有 3 Gb RAM 的普通机器上,我可以同时拥有多少个客户端(实际上——我现在不是在谈论端口数)?

这取决于服务器端的每个连接(每个连接一个线程)消耗了多少资源以及消耗了多长时间。您为每个连接的每个请求执行哪些操作(CPU 限制和 IO 限制)。如果您使用数据库在服务器端读取数据,那么连接数可以大大减少。

2)如果手机使用3G连接,会不会是socket坏了?如果是,我该如何恢复它或者应该从客户端完成?还是自动完成?它经常发生吗?

套接字中断的原因可能有很多,包括:服务器崩溃、网络故障、套接字超时等等。如果 Socket 损坏,则无法将其恢复。它不能由 TCP 自动完成。在这种情况下,您将不得不重新连接服务器。在Socket#getInputStream()的 oracle 官方文档中指定

在异常情况下,底层连接可能会被远程主机或网络软件中断(例如 TCP 连接情况下的连接重置)。当网络软件检测到断开的连接时,以下内容适用于返回的输入流:-

  • 网络软件可能会丢弃由套接字缓冲的字节。没有被网络软件丢弃的字节可以使用 read 来读取。
  • 如果套接字上没有缓冲的字节,或者所有缓冲的字节都已被 read 消耗,那么所有后续的 read 调用都将抛出 IOException。
  • 如果套接字上没有缓冲字节,并且套接字没有使用 close 关闭,则 available 将返回 0。
于 2013-06-27T18:29:53.837 回答
0

需要更多信息,例如当客户端连接时他们做什么,等待服务器发送数据,反之亦然?他们是否保持对话 o 只是等待从对方传输的数据而没有任何对话?

我想当客户端连接时,您启动一​​个线程来调度该客户端,在该线程中您可能会设置一个超时时间,例如 15-30 分钟,如果在此期间没有收到任何数据,您只需关闭套接字并终止线程。另外,同一个 IP 可以建立超过 1 个连接吗?如果不是这样,您需要跟踪谁已连接并终止其先前的会话,以防 IP 已在列表中。

如果跟踪连接进度很重要,我的意思是,您需要从中断的地方继续,然后需要实施精确的对话,以避免重复的事务和/或消息。还有很长的等等,但是,正如我之前所说,需要有关该项目的更多信息。

于 2013-06-27T18:33:51.497 回答