2010-09-03 16 views
5

मैं जावा में एक छोटे एक्सएमपीपी gtalk क्लाइंट को कोड करने की कोशिश कर रहा हूं। मुझे पता है कि बहुत सारी पुस्तकालय हैं जो आपकी मदद करते हैं लेकिन आरएफसी को यह समझना इतना आसान है कि मैं खुद को एक ग्राहक लिखने का फैसला करता हूं। मुझे पता है कि gtalk सर्वर talk.google.com:5222 है, लेकिन जब मैं इस छोटे से कार्यक्रम की कोशिश मैं इस परिणाम मिलता है:जावा में gtalk से कैसे कनेक्ट करें?

HTTP/1.1 302 Found 
Location: http://www.google.com/talk/ 
Content-Type: text/html 
Content-Length: 151 

<HTML><HEAD><TITLE>302 Moved</TITLE></HEAD><BODY><H1>302 Moved</H1>The document has moved <A HREF="http://www.google.com/talk/">here</A>.</BODY></HTML> 

मैं भी उस स्थान का उल्लेख कनेक्ट करने के लिए कोशिश की, लेकिन यह काम नहीं करता। जावा में मेरा कोड यहां दिया गया है:

package fr.grosdim.myjabber; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.net.ssl.SSLPeerUnverifiedException; 
import javax.net.ssl.SSLSocketFactory; 

/** 
* Hello world! 
* 
*/ 
public class App { 
    public static void main(String[] args) { 
     SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory 
       .getDefault(); 
     try { 


      Socket s = new Socket("talk.google.com", 5222); 

      PrintWriter out = new PrintWriter(s.getOutputStream()); 
      out.println("<?xml version=\\'1.0\\' encoding=\\'utf-8\\' ?>"); 
      out 
        .println("<stream:stream to='talk.google.com:5222' " 
          + "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("</stream>"); 
      s.close(); 

     } catch (SSLPeerUnverifiedException e) { 
      System.out.println(" Erreur d'auth :" + e.getLocalizedMessage()); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      System.out.println(e.getLocalizedMessage()); 
     } 

    } 
} 

मैं gtalk सर्वर से कैसे कनेक्ट कर सकता हूं?

उत्तर

2

एक्सएमपीपी लागू करने के लिए एक छोटा प्रोटोकॉल नहीं है, और मुझे नहीं लगता कि आप सर्वर पर हस्त-निर्मित XML स्ट्रिंग भेजकर बहुत दूर हो जाएंगे।

मैं कुछ मौजूदा स्रोत कोड का अध्ययन करने की सलाह दूंगा।

स्पार्क और ओपनफायर जावा में एक अच्छा open source एक्सएमपीपी क्लाइंट और सर्वर कार्यान्वयन का एक उदाहरण है।

आप ओपनफायर को डीबगर में स्थानीय रूप से चलने का प्रयास कर सकते हैं (या वर्बोज़ लॉगिंग चालू के साथ) ताकि आप यह जान सकें कि यह आपके पैकेट के साथ क्या कर रहा है।

+2

स्पार्क एक वेब क्लाइंट है और एक एक्सएमपीपी सर्वर ओपनफायर है, जो आपको चाहिए (क्लाइंट के लिए) स्मैक एपीआई है। – Guillaume

+0

@ गुइलाइम - [स्पार्कवेब] (http://www.igniterealtime.org/projects/sparkweb/index.jsp) एक वेब क्लाइंट है। [स्पार्क] (http://www.igniterealtime.org/projects/spark/index.jsp) एक डेस्कटॉप क्लाइंट है। – Seth

+1

स्मैक के लिए सीधा लिंक यहां है http://www.igniterealtime.org/projects/smack/ –

0

हालांकि सीधे संबंधित नहीं है, आपको किसी सर्वर की जांच करने की आवश्यकता हो सकती है और जिसके लिए आप स्रोत देख सकते हैं। मेरा सुझाव है कि आप देखें कि व्हाइपर लोग क्या कर रहे हैं http://mina.apache.org/vysper/

0

आपको अपने कोड के साथ कई समस्याएं हैं, जो कि डीओएम का उपयोग करने से पहले स्टाइलिस्टिक को गिनने से पहले नहीं है (जो एक्सएमपीपी दुनिया में सबसे अच्छा अभ्यास है)।

  1. आपको "talk.l.google.com" से कनेक्ट करने की आवश्यकता है। सर्वर से कनेक्ट करने के लिए यह पता लगाने के लिए कमांड लाइन पर "dig + short _xmpp-client._tcp.gmail.com SRV" के परिणाम देखें।
  2. अपने एक्सएमएल प्रोलॉग में, आप सिंगल कोट्स से बचने के लिए डबल हैं, जो वास्तव में बैकस्लैश भेज देंगे।
  3. आपकी स्ट्रीम में विशेषता के लिए: पोर्ट नंबर के बिना स्ट्रीम "gmail.com" होना चाहिए।

यह सब कहा जा रहा है कि, मैं अन्य पोस्टर्स को दूसरी जावा क्लाइंट लाइब्रेरी शुरू करने के लिए एक याचिका के साथ दूसरी बार पोस्ट करूंगा, लेकिन मौजूदा में पिच करने के लिए।

0

स्ट्रीम स्टांजा लिखने से पहले आप एक एक्सएमएल संस्करण क्यों लिख रहे हैं? सर्वर परिभाषित प्रारूप की धारा की उम्मीद कर रहा है, न कि एक्सएमएल संरचना। इस लाइन

"out.println("< ? xml version=\\'1.0\\' encoding=\\'utf-8\\' ?>")" 

निकालें तो यह निश्चित रूप से काम करेंगे।

संबंधित मुद्दे