我正在调查一个问题,当我的Android设备在1分钟不活动后与PC通话时断开连接 . PC收到来自Winsock的“断开连接”错误 . 但是在Android上我不知道有什么不对,除非我尝试发送一些东西 . Android设备上的所有省电睡眠和超时功能都被禁用 - 网络,wifi,屏幕等设置为永久保持清醒 .

我的Android代码使用标准的java.net.Socket . 它初始化没有发生事故 . . .

try {
    sock = new Socket(configLGIP, 180 + SafeActivity.pdanum);
    Integer iPDANum = SafeActivity.pdanum + 180;

...初始化后,我向PC发送了“怎么了”消息 . . .

if (sock != null) try {
      sock.setTcpNoDelay(true);  //Make steer smooth
      bin = new BufferedInputStream(sock.getInputStream());
      out = new OutputStreamWriter(sock.getOutputStream(), "US-ASCII");

      //say hello to the front end
      cmdBuf = new String(new StringBuilder("(WhatsUp,").append(session).append(",").append(sSerialNum).append(",SupportsDebulk").append(")").toString());
      out.write(cmdBuf, 0, cmdBuf.length());
      out.flush();
      break;  
. . .

之后它会愉快地发送数据包,除非我在一分钟内什么也不做,当我尝试发送Android发送的数据包时(从Wireshark看到......)

0.728561 10.1.2.1 10.1.2.11 TCP 74 53935→181 [SYN] Seq = 0 Win = 14600 Len = 0 MSS = 1460 SACK_PERM = 1 TSval = 146600337 TSecr = 0 WS = 64

PC上的代码是由另一个程序员(我不知道VB)在Visual Basic中编写的,但是 he can register for an error 因此在连接关闭时得到通知,并且在1分钟后不久就会调用此代码... NB - 这个代码在没有我在Android端做任何事情的情况下被调用 - 只需断开PC的CAT-5电缆与WAP的连接即可

Private Sub winPocRem_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal sCode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

    If (Index = socket_intMax) Then

        'trace error
        Call TraceSocket("TCP socket(" & socket_intMax & ") Err=" & Number & ",Desc=" & Description, INBOUND)
        'reset status

这被称为事件自动调用 - 他不必显式轮询任何东西 .

那么如何在Android中做类似的事情,如果我的连接关闭,我可以通过事件通知我?我有点尴尬,我不知道如何在Android中做一些可以在VB中轻松完成的事情 .

EDIT: 其中一个奇怪的怪癖是,如果PC尝试向Android设备发送数据包并且Android使用RST进行响应,则PC仍然可以使用Android设备 . "ping"是ICMP . UDP也仍然有效 . 事实上,当TCP连接消失时我们可以做的一件事是通过UDP向PC发送消息,告诉它我们的TCP连接不起作用 .