Android套接字稳定通信
我正在从事通过TCP/IP进行通信的Android项目。通信工作在特定的协议上-该协议是面向消息的Android套接字稳定通信,android,sockets,tcp,connection,message,Android,Sockets,Tcp,Connection,Message,我正在从事通过TCP/IP进行通信的Android项目。通信工作在特定的协议上-该协议是面向消息的 android设备通过套接字向服务器发送消息 服务器向android设备发送应答消息 这不是问题,但我有几个危险的问题 我不知道如何解决连接中断(wifi、edge、通过打开的插座将wifi更改为edge等)和连接超时?如果安卓设备发送1条消息,此时出现连接问题-然后安卓设备发送不同的消息(其他请求)-是否保证答案将以正确的顺序发送 我尝试为套接字对象设置超时,但没有成功。我不知道为什么,但如果我
非常感谢。对于TCP套接字,获取超时的方法是使用select()或poll(),在Android中,必须使用SocketChannel()类来处理非阻塞套接字。它们都可以查询套接字一段特定的时间(例如10秒或20秒),并可以告诉您它是可写的(您可以使用send())还是可读的(有数据要读取recv())。另外,select()命令将告诉您套接字是否有错误,很可能是连接中断。当你遇到这样一个错误(除了一个中断的信号,这个应该被忽略并重新发出select),你所能做的就是关闭套接字并重新打开一个新的服务器,据我所知,没有办法恢复一个断开的连接,尽管,如果你已经在协议中实现了,您可以在插座断开时恢复到中断的位置。我不知道您是如何实现该协议的,但大多数协议在继续发送另一条消息之前都需要接收方的肯定确认(确认)。此外,在建立连接时,客户应指定是全新连接还是断开连接,并采取相应措施 这个想法是: 发送方发送一个报头,指定要处理的命令和它将要发送的数据长度。在报头之后,接收方接收报头和数据,一旦它处理它,它向发送方发送一个带有正值的响应ACK数据包,以确认消息,在必要的情况下可以选择使用一些数据。如果在一段合理的时间后您没有收到ACK数据包,那么您可以再次重新发送相同的数据,直到收到肯定的ACK 可能存在这样的情况:客户端发送消息,服务器接收并处理该消息,但当服务器发送肯定的ACK数据包时,连接中断,客户端从未接收到该数据包,因此一旦重新建立连接,它将再次重新发送同一消息。为了避免这种情况,有必要在报头中发送一个消息ID(每发送一条消息都会增加一个整数)来标识它
我知道这听起来很难,事实上很难。如果连接在同一个网络(intranet)上,它工作得很好,但是当通信在internet上时,您可能会面临许多无法控制的问题和情况,因此,有必要制定一个定义良好的协议,在该协议中,您可以从断开的连接中恢复,并且事务/消息不会重复。您是在谈论UDP还是TCP套接字?根据您选择的不同,工作方式也不同。我指的是TCP套接字。我的意思是UDP更容易实现,但协议是通过TCP工作的。