套接字没有为ReadLine()返回NULL或
Socket not returning NULL or for ReadLine()
我读了几篇与readLine()挂起相关的文章和问题。我不确定是否可以在服务器端(远程位置)的响应末尾手动添加NULL。据我所知,我可能无法控制它
<?xml version="1.0" encoding="utf-8"?>
<Response>
<Reply Status="OK" />
<Data attr="..." /> <-- BufferedReader hangs after this is printed.
</Response> <--- I'm assuming this has no "'n" or "null" so it keeps waiting
till the socket closes
我能做些什么来解决这个问题?我不需要最后一行,但我不希望我的代码一直有异常。我使用的是Javascript,下面是我的一部分代码。
if (socketForXML && socketForXML.isConnected()){
socketForXML.setSoTimeout(60000);
var command = new Packages.java.lang.String( theCommand );
var os = socketForXML.getOutputStream();
os.write( command.getBytes("UTF-8") );
os.flush();
log.info("sendXMLCommand - sent command : " + command);
//RECEIVE RESPONSE FROM SERVER - in STRING format
var inStream = socketForXML.getInputStream();
var reader = new Packages.java.io.InputStreamReader(inStream, "UTF-8");
var buffer = new Packages.java.io.BufferedReader( reader );
while( ( line = buffer.readLine() ) != null ) {
log.debug(line);
}
socketForXML.close();
}
我也尝试过使用buffer.read(),它会为我获取/Response标记的所有ASCII数字,但在last>之后,它也会挂起。我试着用try-catch进行检查,但它仍然会等到套接字关闭,并且没有返回任何内容:(.
try{
if (buffer.read() < 0 ){
log.error("END OF FILE.");
}
catch(e) {
log.error("did not work.");
}
我意识到响应的末尾有一个null。
问题是inputStream没有正确关闭。Socket类有两个方法,称为:
isInputShutdown()<-检查输入流是否关闭
inputShutdown()<--关闭输入流,使套接字仍然打开
我不完全清楚为什么它会读取缓冲区并导致其挂起,但可能是它一直在尝试流式传输,而缓冲区已经满了——而输入流中没有什么可接收的了。
while( ( line = buffer.readLine() ) != null ) {
log.debug(line);
if ( !inStream.isInputShutdown() ){
inStream.shutdownInput();
}
}
readLine()从不返回''n,如果没有要读取的行,它将挂起。实现所需功能的方法不是在服务器上"添加NULL"或关闭客户端的输入,而是关闭服务器上的套接字这将导致readLine()返回null。根据你自己的答案,如果你只想要一行,很难理解为什么你有一个循环。
相关文章:
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- php函数的ajax html$_POST值返回null
- 是否可以 document.getElementsByTagName('head')[0] ever 返回 null
- Firebase:查询返回null
- 在浅层渲染的反应组件上,Enzyme为道具返回null
- jQuery Multiselect插件返回null长度(应为0?)
- 如何处理getElementById返回Null
- JavaScript中的RegExp返回null
- Javascript 中的 RegEx 返回 Null
- 加载时的getelementbyID返回null
- 谷歌脚本在第二次调用Gmail后返回null
- Indexeddb OpenCursor在特定键值上返回null
- Ajax响应返回null
- 有没有一种方法可以判断图像src是否在javascript内部返回null
- 当JS在Chrome控制台上正常工作时,Selenium JavaScript执行器返回null
- Auth$getUser返回null,即使用户已登录(AngularFire,Firebase)
- Mongoose JS findOne总是返回null
- 为什么我的ajax调用返回null
- 当与全局标志一起使用时,Javascript Regex在后续调用中返回null
- Regex以确定该值在JS中是否有效,返回null