在客户端和服务器

时间:2016-01-12 11:59:22

标签: java sockets tcp timeout socket-timeout-exception

我们有一个运行的客户端服务器程序,每次运行都很好。在一些奇怪的情况下,它会突然出现并导致以下异常。

在服务器

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)at   java.net.SocketInputStream.socketRead(SocketInputStream.java:116)at   java.net.SocketInputStream.read(SocketInputStream.java:170)at   java.net.SocketInputStream.read(SocketInputStream.java:141)at   com.company.package.ClientClass.read(ClientClass.java:479)

我检查了以下link,其中建议连接重置可能会在参与者“猛烈地”关闭连接时发生,而不使用close()和link建议读取超时的结果是一个套接字,其持续时间超过了从客户端到达的数据的超时值。

我们检查了socketocket和socketocket(socket)的套接字超时值是否设置为-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服务器。在旧服务器上我们从来没有遇到过这个问题,但是在新服务器上,即使系统上没有任何负载,我们也会经常安静地解决这个问题。找到这个link,它说一些旧的插件可能导致这种情况。

1 个答案:

答案 0 :(得分:1)

看起来我们找到了上述问题的答案。我的情况是问题在于带宽。由于带宽较低,消息在网络中丢失。自带宽增加以来已经过去了14天,到目前为止我们还没有再遇到过这个问题。