2011-02-02 27 views
1

我正在设置连接到XMPP服务器的彗星服务器。下面是它的下降:Java套接字提前过期结束

一个客户机连接与彗星服务器,除其他事项外,一个插座连接打开:

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

谢谢你的帮助!

+0

你说服务器关闭连接不太可能,但为了安全起见,你真的检查过readLine()返回null后radio.isConnected()的返回结果吗? – 2011-02-02 19:15:38

+0

您不仅仅使用BOSH(http://xmpp.org/extensions/xep-0206.html),这太糟糕了,或者您可以使用现成的客户端,服务器或两者兼有的东西。 – 2011-02-02 21:03:56

回答

0

请记住,XMPP连接可以并且会在一次读取中为您提供不完整的节或多节。如果你的COMET连接期望你传递的是格式良好的XML,你将会遇到问题。另外,XMPP不是换行符终止的,所以我不确定为什么你期望readLine()非常有用。

接下来,你是否在同一个线程上的两个不同套接字上进行同步I/O?听起来像是僵局的秘诀。如果你坚持走这条路(而不是仅仅使用BOSH),我强烈要求你使用NIO,而不是你的睡眠破解。