gpt4 book ai didi

在客户端和服务器中注意到 java.net.SocketException

转载 作者:行者123 更新时间:2023-12-01 10:35:51 25 4
gpt4 key购买 nike

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

在服务器

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at com.company.process.SomeClass.read(SomeClass.java:829)

在客户

java.net.SocketTimeoutException: Read timed out at 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 的情况下“暴力”关闭连接时,可能会发生连接重置这表明读取超时的原因可能是套接字花费的时间超过了数据从客户端到达的超时值。

我们检查了serversocket和clientsocket(套接字)的套接字超时值是否设置为-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上面说一些旧插件可能会导致这种情况。

最佳答案

看来我们已经找到了上述问题的答案。在我们的案例中,问题在于带宽。由于带宽低,消息在网络中丢失。自增加带宽以来已经过去了 14 天,迄今为止我们还没有再次遇到该问题。

关于在客户端和服务器中注意到 java.net.SocketException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34743124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com