繁体   English   中英

Android套接字稳定通讯

[英]Android socket stable communication

我正在研究通过TCP / IP进行通信的Android项目。 通信使用特定的协议-此协议是面向消息的。

  1. android设备通过套接字向服务器发送消息
  2. 服务器将答案消息发送到android设备

这不是问题,但我有几个特别的问题。

我不知道如何解决连接中断(wifi,边缘,通过打开的套接字将wifi更改为边缘等)和连接超时的问题? 如果android设备发送了1条消息,并且此刻出现连接问题-则android设备发送了不同的消息(其他请求)-是否可以确保按正确的顺序发送答案?

我尝试为套接字对象设置超时,但没有成功。 我不知道为什么,但是如果我将超时设置为5秒,并且我在发送消息之前关闭了服务器-她花了超过5秒钟的时间才开始兴奋。

我没有在互联网上找到有关此问题的任何文章。

非常感谢你。

对于TCP套接字,可以通过使用select()或poll()来获得超时,在Android中,必须使用SocketChannel()( java.nio )类来处理非阻塞套接字。 他们俩都可以查询套接字特定的时间(例如10或20秒),并且可以告诉您套接字是可写的(可以使用send()还是可读的)(可以读取recv()的数据)。 此外,select()命令还将告诉您套接字是否有错误,很可能是连接断开。 当您收到这样的错误时(除了中断的信号,应忽略此错误并重新发出选择),您所能做的就是关闭套接字并用服务器重新打开一个新的错误,据我所知,以恢复断开的连接,但是,如果您已在协议中实现,则可以在套接字断开时从中断处继续。 我不知道您是如何实现该协议的,但是大多数情况下,在继续发送另一条消息之前,它们都需要接收者提供肯定的ACK(确认)。 同样,在建立连接时,客户端应指定是全新连接还是断开的连接,并采取相应措施。

这个想法是:

发送方发送一个标头,该标头指定要处理的命令以及标头之后要发送的数据的长度,接收方接收标头和数据,一旦处理完毕,它将向发送方发送一个肯定的响应ACK数据包。确认消息的值,必要时还可选地包含一些数据。 如果经过一段合理的时间后您没有收到ACK数据包,则可以再次发送相同的数据,直到收到肯定的ACK。

可能存在客户端发送消息,服务器接收并处理消息的情况,但是当服务器发送肯定的ACK数据包时,连接断开,客户端再也没有收到该数据包,因此一旦发送了该消息,客户端将再次重新发送相同的消息。连接重新建立。 为了避免这种情况,有必要在标头中发送消息ID(对于发送的每个消息递增的int)以对其进行标识。

我知道这听起来很困难,而且确实如此。 如果连接位于同一网络(内部网)上,则可以很好地工作,但是,当通信位于Internet上时,您可能会遇到许多无法控制的问题和情况,因此有必要在其中定义一个明确定义的协议从断开的连接中恢复,交易/消息将不会重复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM