2017-05-17 4 views
0

Notre projet implémente la base de cadre de connexion longue sur NIO pour push, il fonctionnait normalement. Ces derniers temps, il y a un problème, "SocketChannel.read (ByteBuffer)" exception throw "java.net.SocketException: recvfrom a échoué: ECONNRESET (réinitialisation de connexion par les pairs)", détails sont les suivants: enter image description herepourquoi SocketChannel invoque read (byteBuffer) throw java.net.SocketException: recvfrom échoue: ECONNRESET (Connexion réinitialisée par homologue)

l'image contient un message d'erreur

le code d'erreur comme suit:

private void read(ByteBuffer byteBuffer, int length) throws Exception { 
     int count = 0; 
     long readBeginMills = SystemClock.elapsedRealtime(); 
     while (count < length) { 
      try { 
       int readCount = mSocketChannel.read(byteBuffer); 
       long nowMills = SystemClock.elapsedRealtime(); 
       if (readCount > 0) { 
        count += readCount; 
        readBeginMills = nowMills; 
       } 
       //1.readCount为-1时是连接断开了,直接报错重连 
       //2.如果读取数据超过了20s也报错重连 
       if(nowMills - readBeginMills >= 20000 || readCount == -1){ 
        throw new LostTcpByteException("byte lost exception,need to shutdown and reconnection"); 
       } 
      } catch (Exception e) { 
       throw e; 
      } 
     } 
    } 

J'ai cherché beaucoup d'erreur semblable, bu t pas trouver une bonne idée pour résoudre le problème, comment puis-je faire? Merci pour l'une de vos réponses!

+0

exception jeter à partir de cette ligne "int readCount = mSocketChannel.read (byteBuffer);" –

Répondre

2

Soit:

  1. Vous avez envoyé des données à une connexion qui avaient déjà été fermées par les pairs
  2. Le pair a fermé la connexion alors qu'il y avait encore des données non lus dans sa prise tampon de réception
  3. Le peer fonctionne sous Windows et son processus s'est arrêté.
  4. Le pair a délibérément réinitialisé la connexion par des moyens que je ne détaillerai pas ici.
  5. L'une des diverses conditions d'hôte ou de réseau est apparue, comme un dépassement de délai de connexion ou une défaillance.
+0

merci, je vais vérifier avec le serveur –