[英]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.