2012-03-19 11 views
0

tcpソケットを介して要求メッセージを送信するために使用できるストリームタイプは、jabberです。Jabberとのソケット接続のみのJava接続

私はxml形式の文字列を書いています。

私はどのライブラリも使用できません。純粋なjavaソケットでなければなりません。

以下は私が使用したコードです。しかし、2番目のXML要求に対する応答がnull

try { 


      Socket s = new Socket("195.211.49.6", 5222); 

      PrintWriter out = new PrintWriter(s.getOutputStream()); 
      out.println("<stream:stream to='nimbuzz.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>"); 

      out.flush(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(s 
        .getInputStream())); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       System.out.println(line); 

      } 

      out.println("<iq type='set' xml:lang='en' id='terms' to='nimbuzz.com'><query xmlns='jabber:iq:auth'><username>username</username><password>password</password><resource>resource</resource></query></iq>"); 
      out.flush(); 
      reader = new BufferedReader(new InputStreamReader(s 
        .getInputStream())); 
      while ((line = reader.readLine()) != null) { 
       System.out.println(line); 

      } 
      s.close(); 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      System.out.println(e.getLocalizedMessage()); 
     } 

これは私がC#で実装したものですが、それはあまりにも非常に高速に動作しています。

Socket m_socWorker; 
       try 
      { 
       m_socWorker = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
       string ipString = "195.211.49.6"; 
       string str2 = "5222"; 
       int port = Convert.ToInt16(str2, 10); 
       IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ipString), port); 
       m_socWorker.Connect(remoteEP); 

      string page=string.Empty, page1=string.Empty, page2=string.Empty; 
      string s = "<stream:stream to='nimbuzz.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>"; 
        byte[] bytes = Encoding.UTF8.GetBytes(s); 
        byte[] buffer = new byte[0x4b38]; 
        m_socWorker.Send(bytes, bytes.Length, SocketFlags.None); 
        int count = 0; 
        count = m_socWorker.Receive(buffer, buffer.Length, SocketFlags.None); 
        page = page + Encoding.ASCII.GetString(buffer, 0, count); 
        byte[] buffer3 = new byte[0x4b38]; 
        int num2 = 0; 
        num2 = m_socWorker.Receive(buffer3, buffer3.Length, SocketFlags.None); 
        page1 = page1 + Encoding.ASCII.GetString(buffer3, 0, num2); 
        if (page1.Replace("\"", "'").IndexOf("<stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>PLAIN TEXT</mechanism></mechanisms><register xmlns='http://jabber.org/features/iq-register'/></stream:features>", 0) != 0) 
        { 
         string str3 = "<iq type='set' xml:lang='en' id='Nimbuzz_Login' to='nimbuzz.com'><query xmlns='jabber:iq:auth'><username>username</username><password>password</password><resource>resource</resource></query></iq>"; 
         byte[] buffer4 = new byte[0x30d40]; 
         buffer4 = Encoding.UTF8.GetBytes(str3); 
         byte[] buffer5 = new byte[0x4b38]; 
         m_socWorker.Send(buffer4, buffer4.Length, SocketFlags.None); 
         int num3 = 0; 
         num3 = m_socWorker.Receive(buffer5, buffer5.Length, SocketFlags.None); 
         page2 = Encoding.ASCII.GetString(buffer5, 0, num3); 
         string str4 = page2.Replace("\"", "'"); 
         int num4 = 1; 
        } 
      } 
       catch (SocketException) 
       { 

       } 
       catch (Exception) 
       { 
       } 

答えて

2

2番目のBufferedReader (InputStreamReader (...))をストリームに添付しています。

おそらく、2番目のリクエストに対する回答が、最初のバッファで消費され、失われている可能性があります。 最初のメッセージBufferedReader reader;を再利用して、2番目のメッセージへの回答をお読みください。 XMPPは単一の双方向ストリームであることを覚えておいてください。そのため、すべての相互作用は接続の存続期間を通じて同じソケットを通じて発生します。

- EDIT -

Q:2番目の要求はどのようにすべきですか?

A:(コンパイルにチェックされていない、あなたに進める方法についてのアイデアを与えるために)あなたの出発点を与えるためにあなたのコードの編集:

private static final int BUFFER_SIZE = 1024; 

// Encapsulate the read process 
private String readData(Reader reader) throws IOException { 
    StringBuilder result = new StringBuilder(); 
    char[] buffer = new char[BUFFER_SIZE]; // [note1] 
    while (reader.ready()) { // [note2] 
     int charsRead = reader.read(buffer,0,BUFFER_SIZE-1)); 
     if (charsRead > 0) { 
      result.append(buffer,0,charsRead); 
     } 
    } 
    return result.toString(); 
} 

public void readStuff() { 
    try { 
     Socket s = new Socket("195.211.49.6", 5222); 

     PrintWriter out = new PrintWriter(s.getOutputStream()); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     out.println("<stream:stream to='nimbuzz.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>"); 
     out.flush(); 

     // Read out the data and print it to the console 
     System.out.println(readData(bufferedReader)); 

     // Second request over the same socket 
     out.println("<iq type='set' xml:lang='en' id='terms' to='nimbuzz.com'><query xmlns='jabber:iq:auth'><username>username</username><password>password</password><resource>resource</resource></query></iq>"); 
     out.flush(); 

     // Read out the answer for the second result 
     System.out.println(readData(bufferedReader)); 


    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     System.out.println(e.getLocalizedMessage()); 
    } 
} 

注:

[1]このバッファは、異なる要求間で再利用できます。このメソッドが呼び出されるたびに、実際に再作成する必要はありません。私はあなたのC#コードでいくつかのアンカーを提供するためにそこにそれを残しました。

[2]あなたのコードでEOFが確認されています。これは、XMPP接続では発生しない可能性があります。より多くのものがなくなるまでストリームで利用可能な文字を読む方が良いです。したがって、私はreader.read(...)の代わりにreader.ready()をチェックしています。- EOFの詳細については、この質問を参照してください。How do I recognize EOF in Java Sockets?

+0

2番目のリクエストはどのようにするべきですか? –

+0

@Rohit私はあなたのコードをこの回答の編集として修正しました。私はこれが役立つことを願っています – maasg

+0

このコードはJava用です。私はJavaプログラマではありませんが、何らかの理由でJavaのC#で行った機能を実装する必要があります –