我们有一个客户端-服务器程序在运行,它几乎每次都能正常工作。在某些奇怪的情况下,它的行为会突然发生并导致后续异常。
在服务器
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.java:170)java.net.SocketInputStream.read(SocketInputStream.java:141)com.company.package.ClientClass.read(ClientClass.java:479)
我已经检查了以下链接,该链接表明当其中一个参与者在不使用close()的情况下"暴力"关闭连接时,可能会发生连接重置,并且该链接表明读取超时的原因可能是数据从客户端到达所需的套接字时间超过超时值。
我们已经检查了serversocket和clientsocket(套接字)的套接字超时值是否设置为-1。有人能提出其他可能导致这种情况的原因吗?
注意:该应用程序不是web应用程序。它只是两个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服务器。在旧服务器上,我们从未遇到过这个问题,但在新服务器上,即使系统上完全没有负载,我们也会经常解决这个问题。找到了这个链接,上面说一些旧插件会导致这种情况。
看来我们已经找到了上述问题的答案。在我们的案例中,问题在于带宽。由于带宽不足,邮件在网络中丢失。带宽增加已经14天了,到目前为止,我们还没有再次面临这个问题。