Java 套接字提前结束流

     2023-02-24     141

关键词:

【中文标题】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。这不应该发生;它应该挂起,直到它接收到数据。服务器似乎不太可能对我关闭,它没有发送&lt;/stream:stream&gt; 来表示 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... 查看详情