繁体   English   中英

在Java 1.8中读取套接字的inputstream错误

[英]Error with reading inputstream of socket in java 1.8

使用以下代码,读取输入流时会发生错误。 我使用以下代码:

public void run() {
    try {
        SocketAddress sockaddr = new InetSocketAddress(nServer, nPort);
        nsocket = new Socket();
        nsocket.connect(sockaddr, 10 * 1000);
        if (nsocket.isConnected()) {
            nsocket.setSoTimeout(20 * 1000); 
            nis = nsocket.getInputStream();
            nos = nsocket.getOutputStream();
            if (nProtocol.equals("ntripv1")) {
                String requestmsg = "GET /" + nMountpoint + " HTTP/1.0\r\n";
                requestmsg += "User-Agent: NTRIP LefebureNTRIPClient/20131124\r\n";
                requestmsg += "Accept: */*\r\n" + "Connection: close\r\n";
                if (nUsername.length() > 0) {
                    requestmsg += "Authorization: Basic " + ToBase64(nUsername + ":" + nPassword) +"\r\n";
                }
                requestmsg += "\r\n";
                nos.write(requestmsg.getBytes());
            } else {
            }

            byte[] buffer = new byte[4096];
            int read = nis.read(buffer, 0, 4096);
            while (read != -1) {
                byte[] tempdata = new byte[read];
                System.arraycopy(buffer, 0, tempdata, 0, read);

                try {
                    dataMessenger.send(Message.obtain(null, MSG_NETWORK_GOT_DATA, tempdata));
                } catch (RemoteException e2) {
                }
                read = nis.read(buffer, 0, 4096);
            }
        }
    } catch (SocketTimeoutException ex) {
        try {
            dataMessenger.send(Message.obtain(null, MSG_NETWORK_TIMEOUT));
        } catch (RemoteException e2) {
        }
    } catch (Exception e) {
            LogMessage(e.getLocalizedMessage());
        e.printStackTrace();
    } finally {
        try {
            nis.close();
            nos.close();
            nsocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            dataMessenger.send(Message.obtain(null, MSG_NETWORK_FINISHED));
        } catch (RemoteException e2) {
        }
    }
}

服务器端可与其他应用程序很好地协同工作。 该代码还与服务器建立连接并获得一些日期,但过了一段时间,它就会出现在nis.read上。

该代码是使用Android Studio的Java 1.8编写的。

是否有人有想法从服务器获取所有信息并读取所有信息,以便可以在应用程序中使用它。

更新 while循环中的以下行给出了错误:

read = nis.read(buffer, 0, 4096); 

更新2给定的错误是:System.err:java.net.SocketException:连接重置

完成发送消息后,请始终在输出流上使用.flush()。 如果需要,可以将其视为一次提交,但这实际上只是一个缓冲问题。

其次。 服务器很有可能正在使用http keep-alive并且没有挂断(即使您将Connection: close设置为HTTP / 1.0的默认设置)也是如此; 然后挂断是客户端的工作。 为此,您需要检测内容是否已完成,因此,您必须同时支持content-length响应标头(如果存在)或“分块”传输编码(可能的话,如果答案大于某个任意量,例如几kB)。 HTTP是一项不错的运动……!

您也可以尝试在GET行上使用no http版本(暗示HTTP 0.9),我认为它根本不支持http keep-alive。

如果服务器假定保持活动状态为打开(请参阅https://en.wikipedia.org/wiki/HTTP_persistent_connection ),则可以说明该行为。 另请参阅https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Connection

我建议您安装Wireshark并监听流量。 使用起来相对直观。 您将看到是否已发送所有数据,以及服务器是否真的忘记关闭(TCP FIN)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM