gpt4 book ai didi

java - 读取输入流时出错 : Software caused connection abort' in java server

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:19 26 4
gpt4 key购买 nike

我基本上是在尝试在 Android 设备上托管服务器。客户端设备通过 TCP 连接到服务器并发送请求。服务器执行客户端请求的操作,然后将数据写回套接字。连接不会被服务器终止,请求将通过套接字连续读取并回复。

注意:每个请求消息的前 4 个字节包含实际消息/请求的长度。

parseXmlInputAndExecuteCmd 函数根据输入的 XML 字符串的内容执行各种异步操作。这最终会导致“allowResponse”变量的 boolean 值更改为 true,并生成特定响应,该响应存储在名为“response”的字符串类型变量中。一旦 boolean 值“allowResponse”变为真,线程将恢复执行并将响应写回套接字的 OutputStream

其中一些异步操作包括连接公司 VPN 和断开连接。这可能是错误的原因吗?

正在使用的一些类级变量是:

private volatile boolean allowResponse = false;
private String response;

服务器代码:

    private void startServer() {
try {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket connectionSocket = serverSocket.accept();
BufferedInputStream bufInpStream = new BufferedInputStream(connectionSocket.getInputStream());
BufferedOutputStream bufOutStream = new BufferedOutputStream(connectionSocket.getOutputStream());
ByteArrayOutputStream contentLengthBaos = new ByteArrayOutputStream();
int c;
int count = 0;
while ((c = bufInpStream.read()) != -1) {
contentLengthBaos.write(c);
count++;
if (count == 4) {
int contLen = getMessageLength(contentLengthBaos);
String content = getMessageContent(bufInpStream, contLen);
parseXmlInputAndExecuteCmd(content);
count = 0;
while (!allowResponse) {
Thread.sleep(1000);
}
allowResponse = false;
byte[] responseDataBytes = response.getBytes();
int outputContLen = responseDataBytes.length;
byte[] contLengthBytes = ByteBuffer.allocate(4).putInt(outputContLen).array();
ByteArrayOutputStream o = new ByteArrayOutputStream();
o.write(contLengthBytes);
o.write(responseDataBytes);
byte finalOutPutBytes[] = o.toByteArray();
bufOutStream.write(finalOutPutBytes);
bufOutStream.flush();
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@NonNull
private String getMessageContent(BufferedInputStream inFromClient, int contLen) throws IOException {
ByteArrayOutputStream contentBaos = new ByteArrayOutputStream();
byte[] contentBytes = new byte[contLen];
for (int i = 0; i < contLen; i++) {
contentBaos.write(inFromClient.read());
ByteArrayInputStream bais = new ByteArrayInputStream(contentBaos.toByteArray());
bais.read(contentBytes);
}
String content = new String(contentBytes);
Log.d(TAG, "Content : " + content);
return content;
}

private int getMessageLength(ByteArrayOutputStream contentLengthBaos) {
byte[] firstFourBytesArr = contentLengthBaos.toByteArray();
int contLen = new BigInteger(firstFourBytesArr).intValue();
contentLengthBaos = new ByteArrayOutputStream();
Log.d(TAG, "Content length: " + contLen);
return contLen;
}

服务器使用以下代码行启动:

Thread serverThread = new Thread(new Runnable() {
@Override
public void run() {
startServer();
}
});
serverThread.start();

我收到以下错误堆栈跟踪:

W/System.err: java.net.SocketException: Software caused connection abort
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:114)
W/System.err: at java.net.SocketInputStream.read(SocketInputStream.java:170)
W/System.err: at java.net.SocketInputStream.read(SocketInputStream.java:139)
W/System.err: at java.io.BufferedInputStream.fill(BufferedInputStream.java:248)
W/System.err: at java.io.BufferedInputStream.read(BufferedInputStream.java:267)
at com.example.umathur.myapplication.MainActivity.startServer(MainActivity.java:192)
at com.example.umathur.myapplication.MainActivity.access$000(MainActivity.java:61)
at com.example.umathur.myapplication.MainActivity$1.run(MainActivity.java:139)
at java.lang.Thread.run(Thread.java:764)

我收到一个名为:java.net.SocketException: Software caused connection abort

的错误

我不确定输入流/输出流的使用哪里出错了。我在以下行收到错误(堆栈跟踪中提到的第 192 行):

while ((c = inputStream.read()) != -1)

在 StackOverflow 上的一些类似问题中,我看到有人说这可能是公司防火墙配置问题?那是对的吗 ?如果是这样,我该如何修复它?

这可能是客户端代码(我无权访问)未正确编写的问题吗?

最佳答案

我无法在本地重现你的问题,有些东西告诉我你的触发条件非常具体,但这里有一些东西可以帮助你诊断和解决你的问题。

  1. 您的代码:如果这是您的代码,那么现有的网络服务器代码应该可以工作。尝试此 nice minimal Medium article on how to create your own Java web server 中的代码.
  2. 防火墙:如果是防火墙,请联系您的网络管理员/团队等。如果您不知道是谁,请与高调的人交谈贵公司的某个人,您可以放心询问,他们应该能够将您引向合适的人选。
  3. 套接字 SO_KEEPALIVE 选项: 我找到了一个 interesting SuperUser question on the subject ,并阅读本期may be caused by the fact that you don't have the SO_KEEPALIVE flag set在你的 socket 上。答案谈到了 PuTTY,但我认为在您的 Java 套接字上尝试可能是值得的。这当然是一个容易实现的尝试。因此,尝试在 Socket connectionSocket = serverSocket.accept(); 行之后通过调用 connectionSocket.setKeepAlive(true); 添加。

关于java - 读取输入流时出错 : Software caused connection abort' in java server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51564025/

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