Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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/8/selenium/4.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
Android套接字稳定通信_Android_Sockets_Tcp_Connection_Message - Fatal编程技术网

Android套接字稳定通信

Android套接字稳定通信,android,sockets,tcp,connection,message,Android,Sockets,Tcp,Connection,Message,我正在从事通过TCP/IP进行通信的Android项目。通信工作在特定的协议上-该协议是面向消息的 android设备通过套接字向服务器发送消息 服务器向android设备发送应答消息 这不是问题,但我有几个危险的问题 我不知道如何解决连接中断(wifi、edge、通过打开的插座将wifi更改为edge等)和连接超时?如果安卓设备发送1条消息,此时出现连接问题-然后安卓设备发送不同的消息(其他请求)-是否保证答案将以正确的顺序发送 我尝试为套接字对象设置超时,但没有成功。我不知道为什么,但如果我

我正在从事通过TCP/IP进行通信的Android项目。通信工作在特定的协议上-该协议是面向消息的

  • android设备通过套接字向服务器发送消息
  • 服务器向android设备发送应答消息
  • 这不是问题,但我有几个危险的问题

    我不知道如何解决连接中断(wifi、edge、通过打开的插座将wifi更改为edge等)和连接超时?如果安卓设备发送1条消息,此时出现连接问题-然后安卓设备发送不同的消息(其他请求)-是否保证答案将以正确的顺序发送

    我尝试为套接字对象设置超时,但没有成功。我不知道为什么,但如果我将超时设置为5秒,并在发送消息之前关闭服务器,她会花5秒多的时间才来

    我在网上没有找到任何关于这个问题的文章


    非常感谢。

    对于TCP套接字,获取超时的方法是使用select()或poll(),在Android中,必须使用SocketChannel()类来处理非阻塞套接字。它们都可以查询套接字一段特定的时间(例如10秒或20秒),并可以告诉您它是可写的(您可以使用send())还是可读的(有数据要读取recv())。另外,select()命令将告诉您套接字是否有错误,很可能是连接中断。当你遇到这样一个错误(除了一个中断的信号,这个应该被忽略并重新发出select),你所能做的就是关闭套接字并重新打开一个新的服务器,据我所知,没有办法恢复一个断开的连接,尽管,如果你已经在协议中实现了,您可以在插座断开时恢复到中断的位置。我不知道您是如何实现该协议的,但大多数协议在继续发送另一条消息之前都需要接收方的肯定确认(确认)。此外,在建立连接时,客户应指定是全新连接还是断开连接,并采取相应措施

    这个想法是:

    发送方发送一个报头,指定要处理的命令和它将要发送的数据长度。在报头之后,接收方接收报头和数据,一旦它处理它,它向发送方发送一个带有正值的响应ACK数据包,以确认消息,在必要的情况下可以选择使用一些数据。如果在一段合理的时间后您没有收到ACK数据包,那么您可以再次重新发送相同的数据,直到收到肯定的ACK

    可能存在这样的情况:客户端发送消息,服务器接收并处理该消息,但当服务器发送肯定的ACK数据包时,连接中断,客户端从未接收到该数据包,因此一旦重新建立连接,它将再次重新发送同一消息。为了避免这种情况,有必要在报头中发送一个消息ID(每发送一条消息都会增加一个整数)来标识它


    我知道这听起来很难,事实上很难。如果连接在同一个网络(intranet)上,它工作得很好,但是当通信在internet上时,您可能会面临许多无法控制的问题和情况,因此,有必要制定一个定义良好的协议,在该协议中,您可以从断开的连接中恢复,并且事务/消息不会重复。

    您是在谈论UDP还是TCP套接字?根据您选择的不同,工作方式也不同。我指的是TCP套接字。我的意思是UDP更容易实现,但协议是通过TCP工作的。