2016-01-12 3 views
0

У нас работает программа клиентского сервера, которая работает отлично almonst каждый раз. В некоторых странных обстоятельствах он ведет себя круто и вызывает следующее исключение.java.net.SocketException, замеченное в клиенте и сервере

На сервере

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(Unknown Source) 
at com.company.process.SomeClass.read(SomeClass.java:829) 

На клиенте

java.net.SocketTimeoutException: Чтение таймаут на java.net.SocketInputStream.socketRead0 (Native Method) в Java .net.SocketInputStream.socketRead (SocketInputStream.java:116) на java.net.SocketInputStream.read (SocketInputStream.java:170) на java.net.SocketInputStream.read (SocketInputStream.java:141) при com.company.package.ClientClass.read (ClientClass.java:479)

Я проверил следующее link которые предполагают Reset Connection может произойти, когда участники «насильственно» закрывают соединение, не используя close() и link, которые предлагают reasion для таймаут чтения Совет должен быть сокет длиной дольше, чем значение таймаута для данных, поступающих от клиента.

Мы проверили значения тайм-аута сокета для обоих серверов, а socketocket (socket) установлены на -1. Может ли кто-нибудь предложить любое другое объяснение, которое могло вызвать это?

Примечание: Приложение не является веб-приложением. Это всего лишь 2 java-программы, сообщающиеся через сокет.

EDIT 1 Фрагмент кода клиентской стороны, вставленный ниже.

import java.io.IOException; 
import java.io.InputStream; 
import java.net.Socket; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

public class SocketConnectionClient implements Runnable { 

    private Socket m_Socket = null; 
    private InputStream m_inStream = null; 

    public SocketConnectionClient() { 
     Connect(); 
    } 

    public void Connect() { 

     try { 
      m_Socket = new Socket("IPAddress", 1234); 
      m_Socket.setReceiveBufferSize(2048); 
      m_Socket.setSendBufferSize(2048); 
      m_Socket.setTcpNoDelay(true); 
      m_inStream = m_Socket.getInputStream(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     // m_Socket.setSoTimeout(m_socketTimeOut); 

     Thread l_Thread = new Thread(this, "Connect"); 
     l_Thread.start(); 
    } 

    public void run() { 
     byte[] bytes = null; 
     try { 
      bytes = new byte[4]; 
      read(4, bytes); // exception originate from here..... 

     } catch (SocketException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void read(int nbytes, byte[] buffer) throws IOException { 
     int nrequired, nreceived, nread; 

     nrequired = nbytes; 
     nreceived = 0; 
     byte[] b = buffer == null ? new byte[nbytes] : buffer; 

     while (nrequired > 0) { 
      nread = m_inStream.read(b, nreceived, nrequired); // exception is 
                   // thrown 
                   // here...... 

      if (nread == -1) { 
       // end of stream - ie socket closed 
       throw new IOException("Bytes read = -1"); 
      } else { 
       nreceived += nread; 
       nrequired -= nread; 
      } 
     } 
    } 
} 

Как дополнительная информация: Мы недавно перешли с сервера Windows 2003 на сервер Windows 2012. На старом сервере у нас никогда не было этой проблемы, но на новой мы часто вызываем эту проблему, даже когда на систему нет абсолютно никакой нагрузки. Нашел это link, в котором говорится, что причиной этого может послужить некоторые старые плагины.

+0

Отправьте свой код клиента, пожалуйста, по крайней мере, часть, где вы создаете и подключаете сокет. – dezhik

+0

Здесь нет ничего, что устанавливает тайм-аут чтения на -1, а -1 не является допустимым значением таймаута чтения. Отбросьте свой метод 'read()' и используйте 'DataInputStream.readFully().' Не устанавливайте буферы отправки и получения для таких небольших значений. Используйте значения по умолчанию, особенно если вы не знаете, что они собой представляют. – EJP

+0

Просто хотел проверить логический вопрос: установка буфера отправки и получения до 2048 на сервере и 13312 у клиента будет проблемой? –

ответ

1

Похоже, мы нашли ответ на вышеупомянутый вопрос. В нашем случае проблема была связана с пропускной способностью. Сообщения терялись в сети из-за низкой пропускной способности. Прошло 14 дней с тех пор, как была увеличена пропускная способность, и мы еще не сталкивались с этой проблемой до настоящего времени.

Смежные вопросы