繁体   English   中英

Java套接字提供了流的过早结束

[英]Java socket giving premature end of stream

我正在设置连接到XMPP服务器的彗星服务器。 这是怎么回事:

客户端与彗星服务器连接,并打开套接字连接:

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流的结束。 关于可能是什么问题的任何想法?

谢谢您的帮助!

请记住,XMPP连接可以并且将在单个读取中给您不完整的节或多个节。 如果您的COMET连接期望传递的是格式正确的XML,那么您将遇到问题。 同样,XMPP不是以换行符结尾的,因此我不确定为什么您期望readLine()非常有用。

接下来,您是否正在同一线程的两个不同套接字上执行同步I / O? 听起来像是陷入僵局的秘诀。 如果您坚持走这条路(而不只是使用BOSH ),我强烈建议您使用NIO,而不是您的睡眠方法。

暂无
暂无

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

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