关键词:
【中文标题】Java 套接字提前结束流【英文标题】:Java socket giving premature end of stream 【发布时间】:2011-02-02 16:21:44 【问题描述】:我正在设置一个连接到 XMPP 服务器的彗星服务器。以下是它的下降方式:
客户端与 Comet 服务器连接,并且打开了一个套接字连接:
try
radio = new Socket("server", 5222);
out = new PrintWriter(radio.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(radio.getInputStream()));
catch (UnknownHostException e)
System.out.println("Unknown host: "+e);
error = e.toString();
catch(IOException e)
System.out.println("IO error: "+e);
error = e.toString();
接下来,启动一个线程,等待来自套接字的数据:
public void run()
System.out.println("Thread started.");
String data;
String error;
Client remote;
Client client;
while(!done)
data = this.output();
remote = bayeux.getClient(remoteId);
client = bayeux.getClient(clientId);
if(data!=null)
Map<String, Object> packet = new HashMap<String, Object>();
packet.put("xml", data);
remote.deliver(client, "/radio/from", packet, null);
error = this.error();
if(error!=null)
Map<String, Object> packet = new HashMap<String, Object>();
packet.put("details", error);
remote.deliver(client, "/radio/error", packet, null);
/* try
Thread.sleep(500);
catch (InterruptedException e )
System.out.println("Interrupted!"); */
try
in.close();
out.close();
radio.close();
catch(IOException e)
System.out.println("Error disconnecting: "+e);
error = e.toString();
System.out.println("Thread stopped.");
public String output()
try
String data = in.readLine();
System.out.println("From: "+data);
if(data==null)
System.out.println("End of stream!");
try
Thread.currentThread().sleep(1000);
catch (InterruptedException e)
e.printStackTrace();
//error = "End of stream.";
//this.disconnect();
return data;
catch (IOException e)
error = e.toString();
System.out.println("IO error! "+e);
return null;
从客户端接收到的任何输入都会转发到 XMPP 服务器:
public void input(String xml)
System.out.println("To: "+xml);
out.println(xml);
所以这就是问题所在。客户端打开连接并将正确的 XML 发送到 XMPP 服务器以启动流。 in.readLine();
应该挂起,直到收到来自服务器的响应。收到后,in.readLine();
开始一遍又一遍地返回 null。这不应该发生;它应该挂起,直到它接收到数据。服务器似乎不太可能对我关闭,它没有发送</stream:stream>
来表示 XMPP 流的结束。关于可能是什么问题的任何想法?
感谢您的帮助!
【问题讨论】:
你说服务器关闭连接的可能性不大,但为了安全起见,你真的检查过 readLine() 返回 null 后 radio.isConnected() 返回什么吗? 很遗憾您没有只使用 BOSH (xmpp.org/extensions/xep-0206.html),或者您可以为客户端、服务器或两者使用现成的东西。 【参考方案1】:请记住,XMPP 连接可以并且会给您提供不完整的节,或者在一次读取中提供多个节。如果您的 COMET 连接期望您传递的内容是格式良好的 XML,那么您将遇到问题。同样,XMPP 不是换行符终止的,所以我不确定您为什么期望 readLine()
非常有用。
接下来,您是否在同一线程上的两个不同套接字上进行同步 I/O?听起来像是陷入僵局的秘诀。如果你坚持走这条路(而不仅仅是使用BOSH),我强烈建议你使用 NIO,而不是你的 sleep hack。
【讨论】:
我会给 NIO 一个机会,尽管我在某处读到现代 linux 系统(我认为提到了 POSIX)线程套接字实际上比 NIO 更有效。但我认为一些重新编码会很好,代码有点糟糕 XD 对 readLine 的良好调用对 XML 没有用处,这是一件愚蠢的事情。addshutdownhook钩子
在开发框架过程中,在结束流的时候需要对当前所有流进行关闭。为了以防忘记关流,可以在初始化操作时,添加钩子,钩子会在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添... 查看详情
cuda线程线程块线程束流多处理器流处理器网格概念的深入理解
一.与CUDA相关的几个概念:thread,block,grid,warp,sp,sm。sp: 最基本的处理单元,streamingprocessor 最后具体的指令和任务都是在sp上处理的。GPU进行并行计算,也就是很多个sp同时做处理sm:多个sp加上其他的一些资源组成一... 查看详情
用于 UDP NAT 打孔的 PHP 和 Java...?
...里开始。我想要一些示例代码开始......(我可以访问带有套接字、cURL和服务器套接字的PHP服务器,所以一些PHP服务器代码也将不胜感激......)提前致谢。编辑:对不起,我不 查看详情
java示例代码_爬上TypeMirror对象的层次结构树
java示例代码_爬上TypeMirror对象的层次结构树 查看详情
序列化java.awt.geom.area(代码片段)
我需要在套接字中序列化一个Area对象(java.awt.geom.Area)。但它似乎不是可序列化的。有没有办法做这样的事情?也许通过将其转换为不同的对象?提前致谢答案我发现了这个解决方法:AffineTransform.getTranslateInstance(0,0).createTransfor... 查看详情
java -version,关于三个不同结果行的问题
】java-version,关于三个不同结果行的问题【英文标题】:java-version,questionaboutthreedifferentresultlines【发布时间】:2021-11-1908:56:03【问题描述】:我用Java编程已经有一段时间了,但实际上从来没有太在意版本控制。但是现在我检查... 查看详情
与 RFECV 结合时如何在 Gridsearch 中使用“max_features”?
...RFECV?【发布时间】:2020-04-0508:51:51【问题描述】:感谢您提前回答。这是我的第一篇文章,我对python比较陌生,所以如果我格式化了一些可怕的东西,我深表歉意。我试图在sklearn中结合递归特征消除和网格搜索来确 查看详情
QTcpSocket 的状态
...QTcpSocket库有问题。我创建了两个程序,它们使用同一个套接字连接与同一个客户端进行通信。不幸的是,这样做,如果程序同时写入,客户端只能通过套接字读取一个字符串(通常是第一个)。所以我需要知道是否存在特定函... 查看详情
我可以在同一个套接字描述符上调用 bind() 然后 connect() 吗?
】我可以在同一个套接字描述符上调用bind()然后connect()吗?【英文标题】:CanIcallbind()andthenconnect()onsamesocketdescriptor?【发布时间】:2019-06-1215:18:41【问题描述】:只是一个关于使用C/C++在Windows应用程序中进行网络套接字编程的奇... 查看详情
如何递归遍历目录,通过 node.js 中的套接字发送所有文件名?
】如何递归遍历目录,通过node.js中的套接字发送所有文件名?【英文标题】:HowcanIrecursivelywalkadirectory,sendingallfilenamesoverasocketinnode.js?【发布时间】:2013-09-2509:54:59【问题描述】:我正在尝试使节点服务器能够通过Web套接字将目... 查看详情
远程登录我的套接字侦听端口正在关闭套接字
】远程登录我的套接字侦听端口正在关闭套接字【英文标题】:telnettingmysocketlisteningportisclosingsocket【发布时间】:2013-01-0410:19:41【问题描述】:我是这个网站的新手,所以如果之前已经回答过这个问题,我会提前道歉,尽管我... 查看详情
如何使用 Telnet 测试我的套接字程序?
】如何使用Telnet测试我的套接字程序?【英文标题】:HowtouseTelnettotestmysocketprogram?【发布时间】:2019-03-1702:16:00【问题描述】:一切都在标题中,我在linux上,我有一个C语言的套接字客户端和一个socker服务器程序,我想用Telnet测... 查看详情
java示例代码_在Java中使用套接字
java示例代码_在Java中使用套接字 查看详情
java示例代码_在java中通信多个套接字
java示例代码_在java中通信多个套接字 查看详情
用于 UDP 客户端的 Windows C 套接字编程
】用于UDP客户端的WindowsC套接字编程【英文标题】:WindowsCsocketprogrammingforUDPclient【发布时间】:2012-02-0507:46:19【问题描述】:我正在尝试查找一些Windows套接字的示例程序。特别是,我有兴趣用C(在VisualStudio中)编写一个使用UDP... 查看详情
java示例代码_识别Java套接字中的EOF
java示例代码_识别Java套接字中的EOF 查看详情
如何在浏览器中查看 Web 套接字响应?
】如何在浏览器中查看Web套接字响应?【英文标题】:HowtoviewWebsocketresponseinbrowser?【发布时间】:2013-03-1001:02:12【问题描述】:我使用的是谷歌浏览器24版我正在查看一个通过websocket调用将数据提取到前端的网站。我的问题是,... 查看详情
Java - 使用 ObjectStream 发送套接字
】Java-使用ObjectStream发送套接字【英文标题】:Java-SendsocketusingObjectStream【发布时间】:2021-11-1920:40:21【问题描述】:我有一个套接字,我想从客户端发送到服务器(或反向)。当java.net.Socket属于java.lang.Object时,为什么不能使用O... 查看详情