java.net.SocketException, замеченный в клиенте и сервере

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

На сервере

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(собственный метод) на java.net.SocketInputStream.socketRead(SocketInputStream.java:116) на java.net.SocketInputStream.read(SocketInputStream.java1) в java.net.SocketInputStream.read(SocketInputStream.java:141) в com.company.package.ClientClass.read(ClientClass.java:479)

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

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

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

РЕДАКТИРОВАТЬ 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. На старом сервере у нас никогда не было этой проблемы, но на новом у нас часто возникает тихая проблема, даже когда система абсолютно не загружена. Нашел эту ссылку, которая говорит, что какой-то старый плагин может вызвать это.

1 ответ

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

Другие вопросы по тегам