Error while reading inputstream : Software caused connection abort' in java server
我基本上是想在Android设备上托管服务器。客户端设备通过TCP连接到服务器并发送请求。服务器执行客户机请求的操作,然后将数据写回套接字。服务器未终止连接,请求将通过套接字连续读取并答复。
注意:每个请求消息的前4个字节包含实际消息/请求的长度。
parsexmlinputandexecutecmd函数根据输入XML字符串的内容执行各种异步操作。这最终导致"allowResponse"变量的布尔值更改为true,并生成一个特定的响应,该响应存储在名为"response"的字符串类型的变量中。一旦布尔值"allowResponse"变为true,线程将继续执行并将响应写回套接字的输出流。
其中一些异步操作包括连接和断开与企业VPN的连接。这可能是错误的原因吗?
正在使用的一些类级变量是:
1 2 |
服务器代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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; } |
使用以下代码行启动服务器:
1 2 3 4 5 6 7 |
我正在获取以下错误堆栈跟踪:
1 2 3 4 5 6 7 8 9 10 11 | 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) |
我收到一个错误,叫做:
我不确定在使用inputstream/outputstream时哪里出错。我在下面的行(StackTrace中提到的第192行)处得到错误:
1 | while ((c = inputStream.read()) != -1) |
在StackOverflow的一些类似问题中,我看到有人说这可能是公司防火墙配置问题?对吗?如果是这样,我该如何修复它?
这可能是客户端代码(我无权访问)编写不正确的问题吗?
我不能在本地重现您的问题,有些事情告诉我您的触发条件非常具体,但这里有一些事情可以帮助您诊断和修复您的问题。
我试着在我的电脑(不是Android)上运行你的代码,它可以很好地工作,只需从浏览器调用"localhost:8080"。
我认为你可以在你的设备里做同样的事情,只是为了知道它是否是一个客户端问题。
我编辑了这两行以避免长时间等待:
1 2 | byte[] contentBytes = new byte[10]; for (int i = 0; i < 10; i++) { |