【问题标题】:java.net.SocketException noticed in client and server在客户端和服务器中注意到 java.net.SocketException
【发布时间】:2016-04-17 00:52:20
【问题描述】:

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

在服务器端

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)

我检查了以下link,这表明当参与者“暴力”关闭连接而不使用 close() 和link 时,可能会发生 连接重置,这表明了 Connection Reset 的原因strong>读取超时可能是一个套接字,该套接字花费的时间超过数据从客户端到达的超时值。

我们检查了服务器套接字和客户端套接字(套接字)的套接字超时值都设置为 -1。有人可以提出任何其他可能导致它的原因吗?

注意:该应用程序不是 Web 应用程序。它只是通过套接字进行通信的 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 服务器。在旧服务器上,我们从来没有遇到过这个问题,但在新服务器上,即使系统上绝对没有负载,我们也会经常解决这个问题。发现这个 link 说一些旧插件可能会导致这种情况。

【问题讨论】:

  • 请发布您的客户端代码,至少是您创建和连接套接字的部分
  • 这里没有将读取超时设置为-1,并且-1首先不是合法的读取超时值。扔掉你的read() 方法并使用DataInputStream.readFully(). 不要将发送和接收缓冲区设置为如此小的值。使用默认值,尤其是当您似乎不知道它们是什么时。
  • 只是想检查一个逻辑问题:将发送和接收缓冲区设置为服务器端的 2048 和客户端的 13312 会有什么问题吗?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2012-06-22
    • 2022-12-31
    • 2022-01-22
    相关资源
    最近更新 更多