У нас работает программа клиентского сервера, которая работает отлично 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, в котором говорится, что причиной этого может послужить некоторые старые плагины.
Отправьте свой код клиента, пожалуйста, по крайней мере, часть, где вы создаете и подключаете сокет. – dezhik
Здесь нет ничего, что устанавливает тайм-аут чтения на -1, а -1 не является допустимым значением таймаута чтения. Отбросьте свой метод 'read()' и используйте 'DataInputStream.readFully().' Не устанавливайте буферы отправки и получения для таких небольших значений. Используйте значения по умолчанию, особенно если вы не знаете, что они собой представляют. – EJP
Просто хотел проверить логический вопрос: установка буфера отправки и получения до 2048 на сервере и 13312 у клиента будет проблемой? –