クライアントサーバープログラムが実行されており、常に正常に動作します。いくつかの奇妙な状況では、突然動作し、次の例外が発生します。
サーバーで
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) での読み取りタイムアウト) com.company.package.ClientClass.read(ClientClass.java:479) で java.net.SocketInputStream.read(SocketInputStream.java:141) で
参加者の 1 人が close() を使用せずに「激しく」接続を閉じると、接続のリセットが発生する可能性があることを示唆する次のリンクを確認しました。クライアントから届きます。
サーバーソケットとクライアントソケット (ソケット) の両方のソケットタイムアウトの値が -1 に設定されていることを確認しました。誰かがそれを引き起こした可能性のある他の理由を提案できますか?
注: アプリケーションは Web アプリケーションではありません。ソケットを介して通信するのは、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 サーバーに移行しました。古いサーバーではこの問題は発生しませんでしたが、新しいサーバーでは、システムに負荷がまったくない場合でも、この問題は頻繁に発生しなくなります。古いプラグインがこれを引き起こす可能性があることを示すこのリンクを見つけました。