Java连接到Jabber,仅使用套接字

Java连接到Jabber,仅使用套接字,java,sockets,Java,Sockets,我可以使用什么类型的流通过tcp套接字向jabber发送请求消息 我正在用xml格式编写一个字符串 我不能使用任何库。它必须是纯java套接字 下面是我使用的代码。但是第二个xml请求的响应是null try { Socket s = new Socket("195.211.49.6", 5222); PrintWriter out = new PrintWriter(s.getOutputStream()); ou

我可以使用什么类型的流通过tcp套接字向jabber发送请求消息

我正在用xml格式编写一个字符串

我不能使用任何库。它必须是纯java套接字

下面是我使用的代码。但是第二个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());
        }
试试看{
插座s=新插座(“195.211.49.6”,5222);
PrintWriter out=新的PrintWriter(s.getOutputStream());
out.println(“”);
out.flush();
BufferedReader reader=新的BufferedReader(新的InputStreamReader
.getInputStream());
弦线;
而((line=reader.readLine())!=null){
系统输出打印项次(行);
}
out.println(“用户名密码资源”);
out.flush();
reader=新的BufferedReader(新的InputStreamReader
.getInputStream());
而((line=reader.readLine())!=null){
系统输出打印项次(行);
}
s、 close();
}捕获(未知后异常e){
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(例外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)
                {
                }
socWorker插座;
尝试
{
m_socWorker=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.IP);
字符串ipString=“195.211.49.6”;
字符串str2=“5222”;
int-port=Convert.ToInt16(str2,10);
IPEndPoint remoteEP=新IPEndPoint(IPAddress.Parse(ipString),端口);
m_socWorker.Connect(remoteEP);
string page=string.Empty,page1=string.Empty,page2=string.Empty;
字符串s=“”;
byte[]bytes=Encoding.UTF8.GetBytes(s);
字节[]缓冲区=新字节[0x4b38];
m_socWorker.Send(字节、字节、长度、SocketFlags.None);
整数计数=0;
count=m_socWorker.Receive(buffer,buffer.Length,SocketFlags.None);
page=page+Encoding.ASCII.GetString(缓冲区,0,计数);
字节[]缓冲区3=新字节[0x4b38];
int num2=0;
num2=m_socWorker.Receive(buffer3,buffer3.Length,SocketFlags.None);
page1=page1+Encoding.ASCII.GetString(buffer3,0,num2);
如果(第1页。替换(“\”,“”).IndexOf(“纯文本”,0)!=0)
{
string str3=“usernamepasswordresource”;
字节[]缓冲区4=新字节[0x30d40];
buffer4=Encoding.UTF8.GetBytes(str3);
字节[]缓冲区5=新字节[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);
字符串str4=page2.Replace(“\”,“”);
int num4=1;
}
}
捕获(SocketException)
{
}
捕获(例外)
{
}

您正在将第二个
缓冲读取器(InputStreamReader(…)
附加到您的流

第二个请求的答案可能正在第一个缓冲区中被消耗和丢失。 尝试重新使用您的初始
BufferedReader阅读器
阅读第二条消息的答案。请记住,XMPP是一个单一的双向流,因此在连接的整个生命周期中,所有交互都是通过同一个套接字进行的

--编辑--

问:第二个请求应该是什么样的

答:编辑代码是为了给您一个起点(不是为了编译而检查,只是为了让您了解如何继续):

private static final int BUFFER_SIZE=1024;
//封装读取过程
私有字符串readData(读取器)引发IOException{
StringBuilder结果=新建StringBuilder();
char[]buffer=新字符[buffer_SIZE];//[note1]
while(reader.ready()){/[note2]
int charsRead=reader.read(缓冲区,0,缓冲区大小-1));
如果(字符读取>0){
追加(缓冲区,0,字符读取);
}
}
返回result.toString();
}
public void readStuff(){
试一试{
插座s=新插座(“195.211.49.6”,5222);
PrintWriter out=新的PrintWriter(s.getOutputStream());
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(s.getInputStream());
out.println(“”);
out.flush();
//读取数据并将其打印到控制台
System.out.println(readData(bufferedReader));
//同一套接字上的第二个请求
out.println(“用户名密码资源”);
out.flush();
//读出第二个结果的答案
System.out.println(readData(bufferedReader));
}捕获(未知后异常e){
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(例外e){
System.out.println(e.getLocalizedMessage());
}
}
注意事项:

[1] 此缓冲区可以跨不同的请求重用。没有必要每次调用此方法时都重新创建它。我把它放在那里是为了给你的C代码提供一些锚定

[2] 您正在检查您的EOF
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());
    }
}