Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字(Android到Java服务器)_Java_Sockets - Fatal编程技术网

Java套接字(Android到Java服务器)

Java套接字(Android到Java服务器),java,sockets,Java,Sockets,我有一个java程序,它作为服务器运行,接受连接,我将Android客户端连接到它。客户端长时间连接到其套接字 1) 在一台具有3 Gb RAM的平均计算机上,我的服务器可以同时拥有多少个客户端(实际上,我现在不是说端口的数量) 2) 如果手机使用3G进行连接,是否有可能插座断开?如果是,我如何恢复,或者应该从客户端恢复?还是自动完成?这种情况经常发生吗?1)取决于服务器为客户端所做的工作。如果服务器只接受连接,而不做更多的事情,那么它可能可以为成千上万的客户机提供服务。如果服务器做一些需要CP

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

1) 在一台具有3 Gb RAM的平均计算机上,我的服务器可以同时拥有多少个客户端(实际上,我现在不是说端口的数量)

2) 如果手机使用3G进行连接,是否有可能插座断开?如果是,我如何恢复,或者应该从客户端恢复?还是自动完成?这种情况经常发生吗?

1)取决于服务器为客户端所做的工作。如果服务器只接受连接,而不做更多的事情,那么它可能可以为成千上万的客户机提供服务。如果服务器做一些需要CPU、内存或I/O的事情,它可以为更少的客户机提供服务

2) 是的,即使在有线网络上,TCP连接也可能中断。如果链路返回,则插座连接未断开;TCP处理丢失数据的重新传输。问题是,如果链接没有恢复,会发生什么?如果使用,连接将最终关闭,但由于默认超时为2小时,因此对此问题敏感的应用程序将实现自己的超时机制

1) 我的服务器可以同时拥有多少个客户端(实际上是im) 不谈现在的端口数)在具有 3GB内存

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

2) 如果手机使用3G进行连接,是否可能 插座坏了?如果是,我如何恢复它或应该如何恢复 从客户端?还是自动完成?这会发生吗 经常

断开套接字的原因可能有很多,包括:服务器崩溃、网络故障、套接字超时或更多。如果一个插座坏了,那么就没有办法恢复了。它不能由TCP自动完成。在这种情况下,您必须重新连接服务器。如oracle官方文档中所述

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

  • 网络软件可能会丢弃套接字缓冲的字节。网络软件未丢弃的字节可以 使用read读取
  • 如果套接字上没有缓冲的字节,或者所有缓冲的字节都已被read占用,则所有后续的read调用都将被删除 抛出一个IOException
  • 如果套接字上没有缓冲的字节,并且未使用close关闭套接字,则available将返回0

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

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


如果跟踪连接进度很重要,我的意思是,您需要继续它停止的地方,然后需要实现一个精确的对话框,以避免重复事务和/或消息。还有很长的一段路要走,但是,正如我之前所说,需要更多关于该项目的信息。

从第二条开始,这是否意味着如果插座发生故障,插座将在发动机罩下恢复?问题是如何检测插座是否已断开太久?(是的,套接字是TCP)永久连接是一种错觉;TCP通过发送数据包来工作。断开的链接意味着数据包丢失。如果链接恢复,数据包将再次到达。您可以在这里阅读TCP如何处理数据包丢失:@ArtemMoskalev套接字将无法恢复。TCP可以容忍间歇性的连接问题和数据包丢失——如果你不进行任何通信,它可以容忍数月的连接丢失。但是,有很多、很多情况下它无法恢复,因此您无论如何都必须处理这些情况(例如,NAT/防火墙超时您的连接、导致TCP超时的网络故障,以及许多其他情况)。您必须在客户机上检测到这一点,这样它才能重新连接,在服务器上检测到这一点,这样它才能摆脱陈旧/失效的套接字。如果您对第1点更感兴趣,您可能应该看看java nio或类似netty的项目。